本文最后更新于:December 3, 2021 pm
问题描述
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
问题思路解析
N皇后视频讲解
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
#include<iostream>
#include<algorithm> #include<functional> #include<numeric> #include<iomanip>
#include<string> #include<vector> #include<queue> #include<map> #include<stack> #include<set> #include<list> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #define IOS ios::sync_with_stdio(0);cin.tie(0),cout.tie(0); using namespace std; const int INF=0x3f3f3f3f; const long long maxn=1e7+5; const long long minn=1e2+5; #define PI acos(-1) int a[minn]; int n; int ans=0; bool check(int row,int col){ for(int i=1;i<=row;++i){ if(a[i]==col) return false; if(i+a[i]==row+col) return false; if(i-a[i]==row-col) return false; } return true; } void dfs(int row){ if(row==n+1) { ans++; return ; } for(int i=1;i<=n;++i){ if(check(row,i)){ a[row]=i; dfs(row+1); a[row]=0; } } } void solve(){ while(cin>>n&&n){ ans=0; dfs(1); cout<<ans<<endl; } } int main(){ IOS; solve(); return 0; }
|