hdu 2553 经典n皇后问题
题意:
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
用一个一维数组来保存每行的皇后所在的列,降低空间复杂度。
这道题比较坑的是不打表容易tle。。。t了2次才不甘心的打表ac。
#include<iostream> #include<math.h> #include<algorithm> #include<stdio.h> #include<string.h> #include<string> #define ll long long #define MAX_N 105 using namespace std; int n; int num[15]; int ans[15],temp; bool judge(int row,int col) { for(int i = 1; i < row; i++) { if(abs(num[i]-col)==abs(i-row) || col==num[i]) return false; } return true; } void solve(int row) { if(row>n) { temp++; return ; } for(int i = 1; i <= n; i++) { if(judge(row,i)) { num[row] = i; solve(row+1); } } } int main() { cin.sync_with_stdio(false); for(int i = 1; i <= 10; i++) { n = i,temp = 0; solve(1); ans[i] = temp; } while(cin>>n,n) { cout<<ans[n]<<endl; } return 0; }