HDU2553 N皇后问题(dfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553
Problem Description
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1
8
5
0
Sample Output
1
92
10
1 /* 2 * @Descripttion: 3 * @version: 4 * @Author: ZKYAAA 5 * @Date: 2020-04-16 17:56:05 6 * @LastEditors: 请叫我ZK谕啊啊啊 7 * @LastEditTime: 2020-04-16 18:44:34 8 */ 9 #pragma GCC optimize(2) 10 #pragma GCC optimize(3) 11 #include <bits/stdc++.h> 12 using namespace std; 13 14 //上次模拟赛,看了Alan聚聚的的题解,nice!抄了代码过来!!!!不会写那就模仿! 15 #define ll long long 16 #define ull unsigned long long 17 #define rint register int 18 #define rep(i, l, r) for (rint i = l; i <= r; i++) 19 #define per(i, l, r) for (rint i = l; i >= r; i--) 20 #define mset(s, _) memset(s, _, sizeof(s)) 21 #define pb push_back 22 #define pii pair<int, int> 23 #define mp(a, b) make_pair(a, b) 24 25 inline int read() 26 { 27 int x = 0, neg = 1; 28 char op = getchar(); 29 while (!isdigit(op)) 30 { 31 if (op == '-') 32 neg = -1; 33 op = getchar(); 34 } 35 while (isdigit(op)) 36 { 37 x = 10 * x + op - '0'; 38 op = getchar(); 39 } 40 return neg * x; 41 } 42 inline void print(int x) 43 { 44 if (x < 0) 45 { 46 putchar('-'); 47 x = -x; 48 } 49 if (x >= 10) 50 print(x / 10); 51 putchar(x % 10 + '0'); 52 } 53 54 55 int n,k=0; 56 int col[12]={0}; 57 bool check(int c,int r){ //检查是否与放好得皇后冲突 58 for(int i=0;i<r;i++){ 59 if(col[i]==c||(abs(col[i]-c)==abs(i-r))) //不同行,不同列,不同斜线 60 return false; 61 } 62 return true; 63 } 64 void dfs(int r){ //一行一行得放皇后,第r行 65 if(r==n){ //所有的皇后都放置好了(递归返回) 66 k++; //统计满足要求的数目 67 return ; 68 } 69 for(int c=0;c<n;c++){ //在每一列放皇后 70 if(check(c,r)){ //判断该位置是否合理 71 col[r]=c; //在第r行第c列放置皇后 72 dfs(r+1); //递归放下一行皇后 73 } 74 } 75 } 76 77 int main(){ 78 int sum[12]={0}; 79 for(n=0;n<=10;n++){ //求出所有N皇后的总数,先打表,不然会TLE 80 memset(col,0,sizeof(col)); //清空,准备计算下一个N皇后 81 k=0; 82 dfs(0); 83 sum[n]=k; //打表 84 } 85 while(cin>>n){ 86 if(n==0) 87 return 0; 88 cout<<sum[n]<<endl; 89 } 90 return 0; 91 }