誰有n皇后問題的答案,n皇后問題到底是什麼問題

2022-09-24 02:00:04 字數 4251 閱讀 2580

1樓:

八皇后問題程式及註解

org 2003-12-3 大榕樹大家一定見過這種辦法吧 ,但是做為初學者理解起來特別困難 ,我就把我當時對它的理解簡單說一下,不對的地方大家給個 建議!

program eightqueens;

varx:array[1..8] of integer;

a,b,c:array[-7..16] of boolean;

i:integer;

procedure print;

var k:integer;

begin

for k:=1 to 8 do write(x[k]:4);

writeln;

end;

procedure try(i:integer);

var j:integer;

begin

for j:=1 to 8 do

if a[j] and b[i+j] and c[i-j]then begin

x:=j;

a[j]:=false;

b[i+j]:=false;

c[i-j]:=false;

if i<8 then try(i+1)

else print;

a[j]:=true;

b[i+j]:=true;

c[i-j]:=true

endend;

begin

for i:=-7 to 16 do

begin

a:=true;

b:=true;

c:=true

end;

try(1);

end. 現在迴圈從 i=1 ,j:=1 to 8 do 開始 此時 計算機檢測到 i=1 j=1 簡化為(1,1)為空,佔用該位置並令該位置對應的斜線和水平方向的位置為 false ,然後程式就開始去執行try(2),注意此時計算機在i=1 這層僅僅走拉乙個迴圈(j=1)就跳到拉i=2 這層裡此時計算機從j:

=1 to 8 do 又開始迴圈,排除 j=1,j=2 得到 (2,3)注意計算機在層裡也只是走拉3(j=3)個迴圈然後又跳到拉i=3 這層依次類推得到(3,5),(4,2)(5,4)而在i=6 這層裡計算機從j:= 1 to 8 do 都沒有找到合適的位置,此時注意在i=6 這層裡計算機計算機將返回到i=5 這層裡,(因為用拉遞迴)並且釋放(5,4)該位置,為什麼要釋放呢?因為原因很簡單如果不釋放的話 該位置對應的斜線和水平方向會對以後的幾層造成影響,讓計算機誤認為為false.

此時的在i=5這層裡 j=4才是結束,然後計算機又會從j=5到 8 開始去找合適的位置 ,如果找不到又會返回到上一層依次類推直到計算機找到一組解 輸出,假設在(8,3)這個位置是計算機找到的一組解,此時計算機又會從j=4到8 開始迴圈,如果找不到 計算機就會返回上一層的即i=7這層接著上一次的跳出位置走完以後的迴圈,依次類推不斷的返回,跳出, 求解,(即令前幾個位置不變,從第8個位置變換,沒有空位置的.接會返回上一層)最後返回到i=1這層裡,注意此時在這層裡也只是走拉j=1個迴圈然後計算機就又開始從j= 2 去試著找....大家有沒有算過求出所有的解要走過多少個迴圈?

我想估計也不下1000個吧.其實整個過程就是乙個重複的過程(即遞迴)倒著想在i=7 這層裡的j=1 位置即(7,1) 計算機會去試從(8,1)到(8,8)這8 個位置,而在(7,2)也同樣會去試這8 個位置 等等在(6,1)會試(7,1)到(7,8) 等. 這是正著考慮(1,1)這裡計算機會試著從(2,1)到(2,8)這8個位置而在這8 個位置裡並沒有試完就有空位置 (2,3)此時計算機會在這個位置對下一層裡開始試(3,1)..

(3,8)依次類推,試不通的返回,接著走完上一層直到試完所有的位置!

2樓:

我這個是不考慮對稱性的結果的遞推演算法,a[i]代表某行的皇后位置precedure eight(n:integer);

vara:array[0..max] of integer;

i,j:integer;

begin

i := 0;

a[i] := -1;

while (i>=0) do

begin

a[i] = a[i]+1;

if a[i]>=n then i-- elsebegin

t:=true;

for j:=0 to i do

if (a[j]=a[i]) or (abs(a[i]-a[j])=abs(i-j)) or (j=i) then

begin

t:=false;

break;

end;

if t then

begin

i := i+1;

if i=n then

begin

輸出一種方案;

i := i-1;

endelse a[i]:=-1;

end;

end;

end;

end;

n皇后問題到底是什麼問題??

3樓:匿名使用者

**於西洋棋中的皇后,通常叫8皇后問題,即在乙個n×n的棋盤上擺放n個皇后,使其中任意兩個皇后都不同列、同行和在一條斜線上。

在資料結構中這是乙個經典的例子,使用棧和遞迴可以求解,請參考《資料結構》,清華大學出版社,嚴蔚敏等編寫

4樓:匿名使用者

n皇后問題

問題描述:

**於西洋棋中的皇后,通常叫8皇后問題,即在n*n的棋盤上,放置n個皇后,要求每一橫行,每一列,每一對角線上均只能放置乙個皇后,求可能的方案及方案數。

解決方案:

program n_queens;

const n=8;

vara:array[1..n] of integer;

mk:array[1..n] of boolean;

total:integer;

procedure output;

var i:integer;

begin

inc(total);

write('no.':4,'[',total:2,']');

for i:=1 to n do write(a[i]:3);

writeln;

end;

function can(d:integer):boolean;

var i:integer;

begin

can:=false;

if mk[a[d]] then exit;

for i:=1 to d-1 do

if abs(a[i]-a[d])=abs(i-d) then exit;

can:=true;

end;

procedure dfs(d:integer);

var i,j:integer;

begin

if (d>n) then

begin

output;

exit;

end;

for i:=1 to n do

begin

a[d]:=i;

if can(d) then

begin

mk[i]:=true;

dfs(d+1);

mk[i]:=false;

end;

end;

end;

begin

fillchar(mk,sizeof(mk),0);

dfs(1);

writeln('total = ',total);

end.

n皇后問題

5樓:匿名使用者

我把我以前的**給你參考下吧!

#include

#include

#define n 4

int column[n+1]; // 同行是否有皇后,1表示有int rup[2*n+1]; // 右上至左下是否有皇后int lup[2*n+1]; // 左上至右下是否有皇后int queen[n+1] = ;

int num; // 解答編號

void backtrack(int); // 遞迴求解int main(void)

void showanswer()

else

}printf("\n"); }}

void backtrack(int i)else

} } }

誰有扶搖皇后?扶搖皇后的大結局誰有?

親,資源已上傳。但是還有哦。所以請繼續追問我上傳。維爾特讓他敢惹他日期。扶搖皇后的大結局誰有?扶搖皇后原著 最後長孫無極送扶搖回了現代,但在現代過了幾天才知道她在這裡的日子,在倒數著長孫的生命。最後她媽媽成全了她,自殺了,只為了不讓女兒為難的做人。母親去世後,扶搖又回到了長孫無極身邊。孟扶搖和長孫無...

我的N大問題

你心理嚴重出現了問題,你找個心理老師看看,你可能患憂鬱症了 人不能想的過於投入了,比如這樣乙個問題 人活著到底為了什麼?有說錢,那你有了錢之後呢?有人說快樂,那你為什麼不快了呢?等等一一詢問的問題,如果你一直往深入的想,你 100會自殺 具體的事情具體分析,不要空想 呵呵 你還真會想哦,我可想不到哦...

N81資料傳輸問題 急 N81的問題

我的n73曾經出現過類似的問題 你拿別人的資料線試看看,或拿別人的手機用你的資料線看看確定是否手機問題 我那次是手機問題 客服給予換主機板或記廠修 我選擇記廠必竟才買兩個月 拿回來之後出現網路有些問題 之後找時間出去客服給予在記廠的 一樣沒備用機 我不修 過了一段時間網路問題越常出現 自己打算在買個...