八皇后問題
ackarlix
八皇后問題是乙個古老而著名的問題,是回溯演算法的典型例題。該問題是十九世紀著名的數學家高斯
1850
年提出:在
8x8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。
高斯認為有
76種方案。
1854
年在柏林的象棋雜誌上不同的作者發表了
40種不同的解,後來有人用圖論的方法解出
92種結果。
演算法一:遞迴實現
n皇后問題
演算法分析:陣列a
、b、c
分別用來標記衝突,
a陣列代表列衝突,從
a[0]~a[7]
代表第0
列到第7
列,如果某列上已經有皇后,則為
1,否則為0;
陣列b代表主對角線衝突,為
b[i-j+7]
,即從b[0]~b[14]
,如果某條主對角線上已經有皇后,則為
1,否則為0;
陣列c代表從對角線衝突,為
c[i+j]
,即從c[0]~c[14]
,如果某條從對角線上已經有皇后,則為
1,否則為0。
程式如下: #
i nclude
static char queen[8][8];
static int a[8];
static int b[15];
static int c[15];
static int iqueennum=0; //
記錄總的棋盤狀態數
void qu(int i); //引數i
代表行
int main() //
主、從對角線標記初始化,表示沒有衝突
for(iline=0;iline<15;iline++)
b[iline]=c[iline]=0;
qu(0);
return 0;}
void qu(int i)
printf("/n/n");}//
如果前次的皇后放置導致後面的放置無論如何都不能滿足要求,則回溯,重置
queen[i][icolumn]='*';
a[icolumn]=0;
b[i-icolumn+7]=0;
c[i+icolumn]=0;}}
} 演算法二:用棧實現的
n皇后問題 #
i nclude
#i nclude
/*===
定義棧與操作
==------------------*/
struct stack *top;
void push(int row,int col);
void pop();
/******
棧的定義完畢
==---------------*/
#define maxqueen 8
/******==
三個衝突陣列確定是否能放置皇后
**///0
表示無衝突,
1表示有衝突
static int a[maxqueen];//
列衝突static int b[maxqueen*2-1];//
主對角線衝突
static int c[maxqueen*2-1];//
副對角線衝突
static int d[maxqueen];
/******=**/
void setqueen(int row,int col);//
放置皇后後在該處設定衝突
void desetqueen(int row,int col);
bool noconflict(int row,int col);//
判斷該位置放置皇后
//是否與其他皇后衝突
//char arrayqueen[maxqueen][maxqueen];
ofstream outqueen;//
定義乙個輸出檔案流
void displayandset();
//bool queen();
//void main()
;//記錄每一列上次的行數,全部初始化為
0while( col
從該列上一次記錄的行數開始迴圈
while(row
判斷該位置是否發生衝突
precolrow[col]=row;//
記錄該列的行
break;//
跳出,進行下一次列迴圈
}row++;//
如果發生衝突,繼續行迴圈
}if(row繼續下一列迴圈
col++; //
如果row
等於了maxqueen,
也就是說,該列無法放置皇后
,else //
需彈出前一列的皇后,
//而且從前一列再開始迴圈,並從被彈出的皇后那一行的下一行開始行迴圈
if(precolrow[0]==maxqueen&&count>0)//
控制結束
return true;
if(precolrow[0]==maxqueen)
return false;
}return true;}
void setqueen(int row,int col)
void desetqueen(int row,int col)
bool noconflict(int row,int col)
void displayandset()
void push(int row,int col)
void pop()}
輸出結果有
92種狀態
八皇后問題
include iostream.h int a 8 8 棋盤 int r 8 結果 int i,j int count 0 void init i j 0 int judge int x,int y for int mi x 1,mj y mi 1 mi for int ri x 1,rj y 1...
八皇后問題
package quess 由於八個皇后的任意兩個不能處在同一行,那麼這肯定是每乙個皇后佔據一行。於是我們可以定義乙個陣列columnindex 8 陣列中第i個數字表示位於第i行的皇后的列號。先把columnindex的八個數字分別用0 7初始化,接下來我們要做的事情就是對陣列columninde...
八皇后問題
1.問題描述 在n n的棋盤上放置n個不能互相捕捉的西洋棋 皇后 的所有布局。這是 於西洋棋中的乙個問題。皇后是棋盤上最具殺傷力的乙個棋子,她可以捕捉與她在同一行,或同一列,或同一斜線 有兩條 上的所有棋子。如下圖所示,紅線經過的格仔都會被皇后捕捉。問題分析 1 皇后的殺傷力在她所對應的行,列,和兩...