1. 程式人生 > 其它 >八皇后問題(遞迴)

八皇后問題(遞迴)

二、程式碼

#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++;
        
return; } 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; }
View Code