回溯 八皇後
阿新 • • 發佈:2019-01-30
要求 print == 如果 void algo 開始 dex als
回溯 八皇後
題意
> 棋子不能在同一行,同一列,以及同一對角線。
> 輸出所有符合要求的情況。
- 步驟:用計數器統計次數,按列寫出全排列,再枚舉任意兩個棋子,如果不符合條件,則計數器不變。與直接遞歸不同的是,用到了剪枝技巧,如果不符合要求,則立即開始下一個狀況
#include <cstdio> #include <algorithm> const int maxn = 100; int n, p[maxn], hashTable[maxn] = {false}; int count = 0; void generateP(int index) { if (index == n + 1) { count++; return; } for(int x = 1; x <= n; x++) { if(hashTable[x] == false) { bool flag = true; for (int pre = 1; pre < index; pre++) { if (abs(index - pre) == abs(x - p[pre])) { flag = false; break; } } if (flag) { p[index] = x; hashTable[x] = true; generateP(index + 1); hashTable[x] = false; } } } } int main() { n = 8; generateP(1); printf("%d", count); return 0; }
輸出結果 92
回溯 八皇後