//============================================================================ //題目:八皇后問題 // 在8*8的國際象棋上擺放8個皇后,其實不能相互攻擊, // 即任意兩個皇后不得處在同一行、同一列或者同一條對角線 //思路:《劍指offer》思路,利用數組的特點,對數組全排列 // 定義一個數組data[8], 用0~7進行初始化,其中數組下標表示皇后所在的行,數組中存儲的數字表示皇后所在的列 // 這樣定義的數組可以確保任意兩個皇后不同行、不同列. // 然后對數組元素進行全排列,判斷任意兩個皇后是否在同一條對角線上: // 正對角線:i-j==data[i]-data[j]; 副對角線:j-i==data[i]-data[j] // //============================================================================ #include<iostream> using namespace std; int sum = 0; void Permutation(int data[],int begin) { int length = 8; int flag = true; //是否符合條件的標記 if (begin == (length-1)) //找到一個排列,判斷是否符合條件 { for (int i = 0;i < length; ++i) { for (int j = 0;j < length; ++j) { if (i != j) { if ((i - j) == (data[i] - data[j]) || (j - i) == (data[i] - data[j])) { flag = false; break; } } } if (flag == false) break; } if (flag == true) { ++sum; for (int i = 0;i < length;++i) //打印符合條件的擺法 { cout << data[i] <<" "; } cout << endl; } } else //對數組進行全排列 { for (int j = begin;j < length;++j) { int temp = data[begin]; data[begin] = data[j]; data[j] = temp; Permutation(data, begin + 1); temp = data[begin]; data[begin] = data[j]; data[j] = temp; } } } int main() { int data[8] = { 0,1,2,3,4,5,6,7 }; Permutation(data, 0); cout << sum << endl; //輸出符合條件的擺法 system("pause"); return 0; }
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。