八皇后問題
輸入:乙個數字n,表示在n*n的**上,合理的擺放n個皇后。
輸出:輸出n個皇后所能擺放的全部可能性,0-該位置不擺放皇后,1-在該位置擺放皇后。
樣例輸入:
1
no answer!!!
2
no answer!!!
4
0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 0
0 0 1 0
1 0 0 0
0 0 0 1
0 1 0 0
.......
問題分析:
該問題是乙個約束滿足問題。
csp(constraint satisfy problem 約束滿足問題):有乙個變數集合和乙個約束集合組成。問題的乙個由對一些或全部變數的乙個賦值定義的完全賦值:每個變數都參與的賦值。問題的解是滿足所有約束的完全賦值,或更進一步,使目標函式最大化。
對於該問題而言,如果是輸入的是8,那麼就是對8*8的矩陣進行賦值,使其滿足該問題的描述。
用xi表示第i個皇后所在列的位置(i表示所在行,xi表示所在的列)。
那麼x1~x8的不同的賦值就是該csp問題的變數集合,但是只有這些變數集合的賦值滿足約束條件的時候才能得到正確解。
該問題的約束條件為:1.任何兩個皇后所在的行不相等(xi和xj中i!=j)。2.任何兩個皇后所在的列不相等(xi!=xj)。3.任何兩個皇后都不在乙個斜線上(對於xi和xj而言,|i-j|!=|xi-xj|)。
只要在上述的變數集合中找出滿足約束條件的變數就能正確解答該題目。
#include#define max 100
int a[max][max];
int n;
int num;
void init_array()
void print_array()
printf("\n");
} printf("***********************\n\n");
}int absolute_number(int x,int y)
void resolute_problem(int level)
else
{ int i,j,k;
int flag;
for(i=1;i<=n;i++)
{ flag = 1;
/判斷列
for(j=1;j
用C 語言實現八皇后問題
一 問題描述 八皇后問題是乙個以西洋棋為背景的問題 如何能夠在 8 8 的西洋棋棋盤上放置八個皇后,使得任何乙個皇后都無法直接吃掉其他的皇后?為了達到此目的,任兩個皇后都不能處於同一條橫行 縱行或斜線上。二 整體設計思路 1.用web控制項table實現棋盤的布局 table控制項在後台用 生成,多...
八皇后問題演算法(C語言實現)
八皇后問題,是乙個古老而著名的問題,是回溯演算法的典型案例。該問題是國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法。高斯認為有76種方案。1854年在柏林的象棋雜誌上不同的作者發表了...
回溯法(八皇后問題)及C語言實現
回溯法,又被稱為 試探法 解決問題時,每進行一步,都是抱著試試看的態度,如果發現當前選擇並不是最好的,或者這麼走下去肯定達不到目標,立刻做回退操作重新選擇。這種走不通就回退再走的方法就是回溯法。很多人認為回溯和遞迴是一樣的,其實不然。在回溯法中可以看到有遞迴的身影,但是兩者是有區別的。回溯法從問題本...