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...
關於用神的問題,關於八字用神的問題
首先要看日幹的強弱,才能取用神。大凡看乙個人日幹強弱的方法,主要有三點。第一 看日幹在所生的月份得令還是不得令。比如日乾甲 乙見月支寅 卯。丙 丁見月支巳 午。戊 己見月支巳 午或辰 戌 醜 未。庚 辛見月支申 酉。壬 癸見月支亥 子。都屬於最佳的得令生旺狀態,所以這日幹就強。反之,日乾在出生的月令...
關於傷官傷盡的問題,關於八字傷官傷盡的問題
在一篇博文中看到 黃大陸先生的論點 男,丁卯 丙午 甲辰 丙寅 兩行成象 木火通明.木火生輝 寅卯辰會木,命局只有木火 以火為用神,喜木生 地支有午火,逢土歲運吉 前人有用傷 傷官傷盡最好妙,尤恐傷多反不宜。此格局中千變化,推論需要用心機。火土傷官宜傷盡,金水傷官要見官。木火見官官要旺,土金官去不成...