八皇后問題(遞迴)
阿新 • • 發佈:2022-03-01
二、程式碼
#include<cstdio> #include<cmath> #include<stdio.h> using namespace std; const int maxn = 11; int count = 0; //P為當前排列,hashTable記錄整數x是否已經在P中 int n, P[maxn], hashTable[maxn] = { false }; //當前處理排列的第index號位 void generateP(int index) { if (index == n + 1) { count++;View Codereturn; } for (int x = 1; x <= n; x++)//第x行 { if (hashTable[x] == false)//第x行還沒有皇后 { bool flag = true;//flag表示當前皇后不會和之前的皇后衝突 for (int pre = 1; pre < index; pre++)//遍歷之前的皇后 {//第index行的皇后的行號為x,第pre列皇后的行號為P[pre] if (abs(index - pre) == abs(x - P[pre])) { flag= false;//與之前的皇后在一條對角線,衝突 break; } } if (flag)//如果可以把皇后放在第x行 { P[index] = x;//令第index列皇后的行數為x hashTable[x] = true;//第x行已經被佔用 generateP(index + 1);//遞迴處理第index+1行皇后 hashTable[x] = false;//遞迴完畢,還原第x行為為佔用狀態 } } } } int main() { scanf_s("%d", &n); generateP(1); printf("%d\n", count); return 0; }