關於八皇后問題,什麼是 八皇后問題 呀

2022-09-21 22:08:17 字數 5385 閱讀 6758

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=1;

for (i=0;i<=14;i++) b=1;

for (i=0;i<=23;i++) c=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樓:匿名使用者

八皇后問題是非常經典的問題,即在8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。

最早由數學王子高斯提出,但他未能給出完美的解答,因為這類問題不適合求解(不借助計算機)

主要做法有回溯法和構造法

儘管作為回溯法的經典題,但採用構造法效率更高(時間複雜度較低)

八皇后問題

3樓:匿名使用者

#include

#include

int pp=0;

int way[100];

print(int n)}}

ifput(int x,int y)

queen(int y,int n)}}

main()

這是n皇后!不光你想要什麼級別的皇后都可以!

而且改動了一下!變成什麼樣子你子執行一下!

酷極了!哈哈、、、祝你好運!

4樓:匿名使用者

忘記了!

自己google下

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

5樓:匿名使用者

八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯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);}

八皇后問題遞迴解法求注釋,看不懂

include int count 用於統計當前是第幾種情況int queen 10 用於儲存當前列的第幾行有皇后int column 20 判斷同列是否有皇后int left 20 從左上至右下判斷是否有皇后int right 20 從右上至左下判斷是否有皇后void prt1 負責列印 void...

關於用神的問題,關於八字用神的問題

首先要看日幹的強弱,才能取用神。大凡看乙個人日幹強弱的方法,主要有三點。第一 看日幹在所生的月份得令還是不得令。比如日乾甲 乙見月支寅 卯。丙 丁見月支巳 午。戊 己見月支巳 午或辰 戌 醜 未。庚 辛見月支申 酉。壬 癸見月支亥 子。都屬於最佳的得令生旺狀態,所以這日幹就強。反之,日乾在出生的月令...

關於傷官傷盡的問題,關於八字傷官傷盡的問題

在一篇博文中看到 黃大陸先生的論點 男,丁卯 丙午 甲辰 丙寅 兩行成象 木火通明.木火生輝 寅卯辰會木,命局只有木火 以火為用神,喜木生 地支有午火,逢土歲運吉 前人有用傷 傷官傷盡最好妙,尤恐傷多反不宜。此格局中千變化,推論需要用心機。火土傷官宜傷盡,金水傷官要見官。木火見官官要旺,土金官去不成...