問題描述:在乙個8*8的西洋棋盤上擺放8個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列和同一斜線上,問有多少種擺法。
思路:因為每行、每列都只能有乙個皇后,因此可以按照行來看,對每行皇后所在的列做乙個標記。
每個後可以按照行來看,那麼每個列數可以看作乙個全排列。上圖所表示的全排列為:62714853
下面結合**和注釋講解具體實現過程:在這裡插入**片
#includeint num[9],book[9],count;
//num陣列給1-8做標記,i已被使用num[i]標記為1
//book陣列儲存全排列,book[k]表示第k行放的皇后的列
//count計算方法數
void fun(int x)//1-8的全排列並判斷是否符合要求
,hash2[17]=,hash3[17]=;
for(int k=1;k<=8;k++)
else
} for(int i=2;i<=16;i++)
for(int j=0;j<=8;j++)
}if(flag)
printf("\n");
} } else
} }}int main()
注:以上**實現了將所有符合要求的全排列輸出,並輸出方法數。 八皇后問題 之全排列解法
問題的分解一共有兩步 1.生成問題的所有候選解空間 2.過濾掉那些不滿足要求的細化這兩步,需要認識到下面兩點 1.八皇后所有候選解空間是 1,2,3,4,5,6,7,8 這個集合中元素的全排列 這個全排列不僅列出了候選解,並且還自動規避掉了皇后在橫 豎方向上攻擊的問題 2.接下來八皇后相互攻擊的問題...
python全排列解決八皇后問題
八皇后問題是指8x8的西洋棋棋盤上,如何放置8個皇后,使得任意兩個皇后不會互相攻擊。算上對稱解的話,八皇后問題有91個解 當然,我們習慣從0開始計數 不難想到,用 0,1,2,3,4,5,6,7 八個數字組成個tuple,其中數字所在位置代表了行,數字本身代表了列,則任意乙個排列即代表一種放置方法,...
全排列問題和八皇后問題
全排列問題的解法如下 include const int maxn 11 int n,p maxn hashtable maxn void generatep int index printf n return for int x 1 x n x int main 解析如下 取自 演算法筆記 運用這...