1樓:匿名使用者
〖問題描述〗
在乙個8×8的棋盤裡放置8個皇后,要求每個皇后兩兩之間不相"衝"(在每一橫列豎列斜列只有乙個皇后)。
〖問題分析〗(聿懷中學 呂思博)
這道題可以用遞迴迴圈來做,分別一一測試每一種擺法,直到得出正確的答案。主要解決以下幾個問題:
1、衝突。包括行、列、兩條對角線:
(1)列:規定每一列放乙個皇后,不會造成列上的衝突;
(2)行:當第i行被某個皇后占領後,則同一行上的所有空格都不能再放皇后,要把以i為下標的標記置為被占領狀態;
(3)對角線:對角線有兩個方向。在同一對角線上的所有點(設下標為(i,j)),要麼(i+j)是常數,要麼(i-j)是常數。
因此,當第i個皇后占領了第j列後,要同時把以(i+j)、(i-j)為下標的標記置為被占領狀態。
2、資料結構。
(1)解陣列a。a[i]表示第i個皇后放置的列;範圍:1..8
(2)行衝突標記陣列b。b[i]=0表示第i行空閒;b[i]=1表示第i行被占領;範圍:1..8
(3)對角線衝突標記陣列c、d。
c[i-j]=0表示第(i-j)條對角線空閒;c[i-j]=1表示第(i-j)條對角線被占領;範圍:-7..7
d[i+j]=0表示第(i+j)條對角線空閒;d[i+j]=1表示第(i+j)條對角線被占領;範圍:2..16
〖演算法流程〗
1、資料初始化。
2、從n列開始擺放第n個皇后(因為這樣便可以符合每一豎列乙個皇后的要求),先測試當前位置(n,m)是否等於0(未被占領):
如果是,擺放第n個皇后,並宣布占領(記得要橫列豎列斜列一起來哦),接著進行遞迴;
如果不是,測試下乙個位置(n,m+1),但是如果當n<=8,m=8時,卻發現此時已經無法擺放時,便要進行回溯。
3、當n>;8時,便一一列印出結果。
〖優點〗逐一測試標準答案,不會有漏網之魚。
〖參考程式〗queen.pas
program tt;
var a:array [1..8] of integer;
b,c,d:array [-7..16] of integer;
t,i,j,k:integer;
procedure print;
begin
t:=t+1;
write(t,' ');
for k:=1 to 8 do write(a[k],' ');
writeln;
end;
procedure try(i:integer);
var j:integer;
begin
for j:=1 to 8 do
if (b[j]=0) and (c[i+j]=0) and (d[i-j]=0) then
begin
a:=j;
b[j]:=1;
c[i+j]:=1;
d[i-j]:=1;
if i<8 then try(i+1)
else print;
b[j]:=0;
c[i+j]:=0;
d[i-j]:=0;
end;
end;
begin
for k:=-7 to 16 do
begin
b[k]:=0;
c[k]:=0;
d[k]:=0;
end;
try(1);
end.
2樓:匿名使用者
網上有的是 這種問題也要問嗎 人要學會自立 不要什麼事都問
什麼是"八皇后問題"呀?
3樓:匿名使用者
八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯2023年提出:在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。
高斯認為有76種方案。2023年在柏林的象棋雜誌上不同的作者發表了40種不同的解,後來有人用圖論的方法解出92種結果。
對於八皇后問題的實現,如果結合動態的圖形演示,則可以使演算法的描述更形象、更生動,使教學能產生良好的效果。下面是筆者用turbo c實現的八皇后問題的圖形程式,能夠演示全部的92組解。八皇后問題動態圖形的實現,主要應解決以下兩個問題。
(1)回溯演算法的實現
(a)為解決這個問題,我們把棋盤的橫座標定為i,縱座標定為j,i和j的取值範圍是從1到8。當某個皇后佔了位置(i,j)時,在這個位置的垂直方向、水平方向和斜線方向都不能再放其它皇后了。用語句實現,可定義如下三個整型陣列:
a[8],b[15],c[24]。其中:
a[j-1]=1 第j列上無皇后
a[j-1]=0 第j列上有皇后
b[i+j-2]=1 (i,j)的對角線(左上至右下)無皇后
b[i+j-2]=0 (i,j)的對角線(左上至右下)有皇后
c[i-j+7]=1 (i,j)的對角線(右上至左下)無皇后
c[i-j+7]=0 (i,j)的對角線(右上至左下)有皇后
(b)為第i個皇后選擇位置的演算法如下:
for(j=1;j<=8;j++) /*第i個皇后在第j行*/
if ((i,j)位置為空)) /*即相應的三個陣列的對應元素值為1*/
(2)圖形訪問
在turbo c語言中,圖形的訪問可用如下標準函式實現:
size=imagesize(x1,y1,x2,y2) ;返回儲存區域所需位元組數。
arrow=malloc(size);建立指定大小的動態區域位圖,並設定一指標arrow。
getimage(x1,y1,x2,y2,arrow);將指定區域位圖存於一緩衝區。
putimage(x,y,arrow,copy)將位圖置於螢幕上以(x,y)左上角的區域。
(3)程式清單如下
#include
#include
#include
#include
char n[3]=;/*用於記錄第幾組解*/
int a[8],b[15],c[24],i;
int h[8]=;/*每個皇后的行座標*/
int l[8]=; /*每個皇后的列座標*/
void *arrow;
void try(int i)
bar(260,300,390,340);/*顯示第n組解*/
outtextxy(275,300,n);
delay(3000);
}a[j-1]=1;b[i+j-2]=1;c[i-j+7]=1;
putimage(h[i-1],l[j-1],arrow,xor_put);/*消去皇后,繼續尋找下一組解*/
delay(500);
}}int main(void)
rectangle(50,5,100,40);
rectangle(60,25,90,33);
/* 畫皇冠 */
line(60,28,90,28);line(60,25,55,15);
line(55,15,68,25);line(68,25,68,10);
line(68,10,75,25);line(75,25,82,10);
line(82,10,82,25);line(82,25,95,15);
line(95,15,90,25);
size=imagesize(52,7,98,38); arrow=malloc(size);
getimage(52,7,98,38,arrow); /* 把皇冠儲存到緩衝區 */
clearviewport();
settextstyle(triplex_font, horiz_dir, 4);
setusercharsize(3, 1, 1, 1);
setfillstyle(1,4);
for (i=0;i<=7;i++) a[i]=1;
for (i=0;i<=14;i++) b[i]=1;
for (i=0;i<=23;i++) c[i]=1;
for (i=0;i<=8;i++) line(125,i*35+5,525,i*35+5); /* 畫棋盤 */
for (i=0;i<=8;i++) line(125+i*50,5,125+i*50,285);
try(1); /* 呼叫遞迴函式 */
delay(3000);
closegraph();
free(arrow);}
4樓:劉志國老師
八個皇后放入64個格中,同一條線(橫線,豎線,斜線)上的皇后將被吃掉,
八皇后問題是什麼問題呀
5樓:匿名使用者
在8×8的西洋棋棋盤上放置8個皇后,要求任意兩個皇后不能在同一行、同一列或同一條對角線上。
6樓:匿名使用者
八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯2023年提出:在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。
高斯認為有76種方案。2023年在柏林的象棋雜誌上不同的作者發表了40種不同的解,後來有人用圖論的方法解出92種結果。事實上就是有92種解法。
八皇后問題
7樓:匿名使用者
#include
#include
int pp=0;
int way[100];
print(int n)}}
ifput(int x,int y)
queen(int y,int n)}}
main()
這是n皇后!不光你想要什麼級別的皇后都可以!
而且改動了一下!變成什麼樣子你子執行一下!
酷極了!哈哈、、、祝你好運!
8樓:匿名使用者
忘記了!
自己google下
八皇后問題的問題概述
9樓:天鋋乿
八皇后問題是乙個以西洋棋為背景的問題:如何能夠在 8×8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行、縱行或斜線上。
八皇后問題可以推廣為更一般的n皇后擺放問題:這時棋盤的大小變為n×n,而皇后個數也變成n。當且僅當 n = 1 或 n ≥ 4 時問題有解。
八皇后問題最早是由國際西洋棋棋手馬克斯·貝瑟爾於2023年提出。之後陸續有數學家對其進行研究,其中包括高斯和康托,並且將其推廣為更一般的n皇后擺放問題。八皇后問題的第乙個解是在2023年由弗朗茲·諾克給出的。
諾克也是首先將問題推廣到更一般的n皇后擺放問題的人之一。2023年,s.岡德爾提出了乙個通過行列式來求解的方法,這個方法後來又被j.
w.l.格萊舍加以改進。
艾茲格·迪傑斯特拉在2023年用這個問題為例來說明他所謂結構性程式設計的能力。
八皇后問題出現在2023年代初期的著名電子遊戲第七訪客中。
八皇后問題求解方法分類,八皇后問題解決思路
看看這 講的很詳細。八皇后問題解決思路 先宣告我們根據條件可以知道皇后肯定是每行都有且只有乙個所以我們建立乙個陣列x t 讓陣列角標表示八皇后的行,用這個角標對應的陣列值來確定這個皇后在這行的那一列。我們用遞迴來做 這問題要求皇后所在的位置必須和其他皇后的位置不在同一行 列還有 把兩個皇后看成點其 ...
花中皇后是誰,什麼花是花中皇后?
月季花花中皇后指代的是月季花。它的別稱還有 月月紅 勝春花 長春花 等等,一年四季都可以綻放,在開花時有明顯的花香氣味,常見白色 粉色 黃色 紅色等等,還有混色 銀邊等品種,花型也很豐富,觀賞性特別高。生長環境 月季花成長時,對於氣候 土壤等方面要求嚴格。需要使用富含有機質,肥沃疏鬆的微酸性壤土作為...
長孫皇后是誰 長孫皇后叫什麼
文德皇后長孫氏 601年3月15日 636年7月28日 名長孫無垢,小字觀音婢 河南洛陽人,隋朝右驍衛將軍長孫晟之女,母親高氏為漢族,唐朝宰相長孫無忌同母妹,唐太宗 李世民 的皇后。李世民的妻子 皇后 觀音婢 長孫無忌的姐姐。李世民一生的摯愛。唐太宗李世民的正妻,13歲嫁李世民。唐高宗李治的母親。長...