[pascal]怎樣把四皇后改為n皇后?
1樓:網友
這程式漏洞百出。
給你個正確程式program project1;
const max=10;
type arr=array[1..max]of integer;
var a:arr; n:integer;
procedure aqueen(n:integer);
var i,j,k,total:integer;
begintotal:=0;
for i:=1 to n do a[i]:=1;
i:=1;while true do
beginif (a[i]<=n) thenbegink:=1;
while (k<=i-1)and ((a[i]-a[k])*abs(a[i]-a[k])-abs(i-k))<0) do
k:=k+1;
if k<=i-1 then begin inc(a[i]);continue; end;
inc(i);
if (i<=n) then continue;
inc(total); write(total:5,':
for j:=1 to n do write(a[j]:5); writeln;
inc(a[n]);i:=n; continue;
endelse
begina[i]:=1; i:=i-1;
if i<1 then break;
inc(a[i]);continue;
end;end;
end;begin
readln(n);
aqueen(n);
readln;
end.
pascal n皇后問題
2樓:粉紅的曉曉
n皇后問題(非遞迴)
top := 1; // 從第乙個皇后開始嘗試。
while (top > 0) do // 當還有活動節點時迴圈。
if (top > n) then // 是否n個皇后都放置在棋盤了。
begininc(count); // 找到一組解,總數加一。
dec(top); // 回到上一皇后繼續。
end else // n個皇后還沒有都放置好。
begininc(x[top]);// 當前皇后到下一列。
if (x[top] >n) then // 是否超出棋盤。
dec(top) // 超出棋盤,回到上乙個皇后繼續。
else // 沒有超出棋盤。
if check(top) then // 檢查當前位置是否可以放皇后。
begininc(top); // 可以放置,繼續嘗試下乙個皇后。
x[top] := 0; // 下乙個皇后從第一列開始嘗試。
end; end;
n皇后問題(邊界判定)
function check(pos: integer): boolean;
vari: integer;
begincheck := true;
for i := 1 to pos - 1 do
if (x[pos] = x[i]) or (abs(x[pos] -x[i]) = abs(pos - i)) then
begincheck := false;
break;
end;end;
n皇后問題(遞迴)
procedure search(k: integer);
vari: integer;
beginif k > n then // 是否前n個皇后都已經放下。
inc(count)
else // 還有皇后沒放。
for i := 1 to n do // 從第1列開始逐列嘗試。
beginx[k] := i; // 把第k個皇后放在第i列。
if check(k) then // 第k個皇后是否可以放在第i列。
search(k + 1); // 可以放,繼續處理第k+1個皇后。
end;end;
pascal-n皇后變種
3樓:網友
比普通的n皇后問題多加乙個map陣列即可。
program nqueen;
var n,i,j,ans:longint;
map:array[1..14,1..14] of char;
a:array[1..14] of integer;
b:array[1..14] of boolean;
c:array[2..28] of boolean;
d:array[-13..13] of boolean;
procedure work(t:integer);
var k:integer;
beginif t>n then begin ans:=ans+1; exit; end;
for k:=1 to n do
if (map[t,k]='*') and (b[k]=true) and (c[t+k]=true) and (d[t-k]=true) then
beginb[k]:=false;
c[t+k]:=false;
d[t-k]:=false;
work(t+1);
b[k]:=true;
c[t+k]:=true;
d[t-k]:=true;
end;end;
beginfillchar(b,sizeof(b),true);
fillchar(c,sizeof(c),true);
fillchar(d,sizeof(d),true);
readln(n);
for i:=1 to n do
beginfor j:=1 to n do
read(map[i,j]);
readln;
end;work(1);
writeln(ans);
end.
n皇后、pascal請高手糾錯、
4樓:網友
首先,201一般是陣列下標越界。
我沒有看你的演算法,但是檢查了一下你程式裡變數,在judge裡有個i:=i-1;
j:=a[i]+1; 這裡i有可能會為0,所以你在var裡a的範圍是[0..20]才對。
我改了以下,就沒報201了,但是,說老實話,乙個n皇后至於寫這麼多嗎,乙個回溯的主過程10行就可以搞定。
具體的回溯,你可以再找我聊吧。
n皇后問題 pascal 菜鳥求解
5樓:我是小葉子
至少要在make中的迴圈加begin end把。
海爾電腦怎樣把啟動項改為u盤啟動
您好,感謝向企業知道提問 有任何問題歡迎諮詢售後工程師4006999999歡迎您再次向企業知道提問.祝您工作生活愉快 聯想電腦怎樣設定u盤為第一啟動項?海爾手提進入boot怎樣設定u盤啟動?如何設定電腦啟動項的為u盤啟動 在開機的時候進入boot meau可以選擇從硬碟啟動還是u盤啟動 不同電腦進入...
急 怎樣把PS的圖層的混合模式改為 濾色
其實就是變得bai比較白,把兩du 個圖層較白的部分過zhi濾出來 多試驗幾下,再對dao比回一下其他的圖層混答合模式,就能明白了 更正式一點說就是 濾色 混合模式效果與 正片疊底 的效果相反,在整體效果上顯示由上方圖層和下方圖層的畫素值中較亮的畫素合成的效果,得到的影象是一種漂白影象中顏色的效果。...
不小心把檔案開啟方式改了,請問怎樣改為最初的開啟方式(以前的開啟方式我不知道)
windows系統的資訊都寫入了登錄檔中,因此想刪除檔案關聯可以通過修改登錄檔解決。強烈建議對登錄檔操作前進行備份或建立系統還原點 雖然我很少這麼做 根據網上的內容,刪除檔案關聯的幾處登錄檔是 hkey current user software microsoft windows currentv...