演算法設計例題:n後問題(回溯)
阿新 • • 發佈:2020-12-04
Description
在n×n格的棋盤上放置彼此不受攻擊的n個皇后。按照國際象棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n後問題等價於在n×n格的棋盤上放置n個皇后,任何2個皇后不放在同一行或同一列或同一斜線上。
Input輸入的第一個為測試樣例的個數T,接下來有T個測試樣例。每個測試樣例的只有一行一個數n ( n < 15 ),表示棋盤的大小。
Output對應每個測試樣例輸出一行結果:可行方案數。
Sample Input2
3
4
0
2
#include<bits/stdc++.h> #define ll long long constint 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; } }