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