1. 程式人生 > 實用技巧 >演算法設計例題:n後問題(回溯)

演算法設計例題:n後問題(回溯)

Description

在n×n格的棋盤上放置彼此不受攻擊的n個皇后。按照國際象棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n後問題等價於在n×n格的棋盤上放置n個皇后,任何2個皇后不放在同一行或同一列或同一斜線上。

Input

輸入的第一個為測試樣例的個數T,接下來有T個測試樣例。每個測試樣例的只有一行一個數n ( n < 15 ),表示棋盤的大小。

Output

對應每個測試樣例輸出一行結果:可行方案數。

Sample Input

2
3
4

Sample Output

0
2

#include<bits/stdc++.h>
#define ll long long
const
int maxn = 1e3+10; using namespace std; bool b[maxn],c[maxn],d[maxn]; int n,ans; void solve(int j){ if(j>n){ans++;return;} for(int i=1;i<=n;i++){ if(!b[i]&&!c[i+j]&&!d[j-i+n]){ b[i]=c[i+j]=d[j-i+n]=1; solve(j+1); b[i]=c[i+j]=d[j-i+n]=0
; } } } int main() { int t;cin>>t; while(t--){ cin>>n; ans=0; solve(1); cout<<ans<<endl; } }