什麼是 八皇后問題 呀,什麼是八皇后問題?

2022-07-19 00:25:42 字數 5531 閱讀 2340

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為令回在家 熏...