1樓:匿名使用者
八皇后問題是一個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯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);}
2樓:劉志國老師
八個皇后放入64個格中,同一條線(橫線,豎線,斜線)上的皇后將被吃掉,
什麼是八皇后問題?
3樓:匿名使用者
〖問題描述〗
在一個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.
4樓:匿名使用者
網上有的是 這種問題也要問嗎 人要學會自立 不要什麼事都問
八皇后問題是什麼問題呀
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年代初期的著名電子遊戲第七訪客中。
pascal八皇后問題,八皇后問題 PASCAL
別人放程式,我一般不看的,好長。所以我也不放了,告訴你幾種方法吧。1 普通方法 搜尋 貌似12皇后還是13皇后就一秒鐘出不來了。2 利用棋盤的對稱,加快搜尋。3 位運算 算是用2進位制模擬搜尋,只不過判斷和操作速度很快。具體請call我。八皇后問題 pascal 我的演算法是回溯。program x...
中國唯一沒有皇后的君主是誰,為什麼不立皇后?
可能是他自視甚高,覺得沒有女的配得上自己 也可能他是立了後的,但不知什麼原因史書把這些內容刪除了。秦始皇嬴政,有人說 他擔心外戚干政,所以乾脆不立後,也有人說 他的私生活太亂的母親令他失望,故不希望自己的皇后也是如此。是秦始皇,相處秦始皇由於身世及受周圍環境的影響,自小養成了刻薄 多疑的性格,他擔心...
八關齋戒的問題,什麼是八關齋戒
我最近也讀到南師的這段話 個人理解,應該是南師解釋的對 坐床不大可能,高廣大床應解釋為上座才對。僧團有僧團的規矩,無規矩不成方圓,遵守為好。老和尚是在度南懷瑾老先生。什麼是八關齋戒 八關齋戒 bai是指在家的善男信女du,於一日 一夜,能夠修持齋戒,就可zhi關閉諸惡趣門.是佛陀dao為令回在家 熏...