HDU2553 N皇后问题
思路:回溯法求解。关键在于找出皇后能攻击的格子,竖直方向的好找,斜45方向就需要找下规律。
列 - 行
0 1 2 3 4
-1 0 1 2 3
-2 -1 0 1 2
-3 -2 -1 0 1
-4 -3 -2 -1 0
列+行
0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
AC代码:
1 #include<iostream>
2 #include<string.h>
3 using namespace std;
4 int flag[15];
5 int vis[2][30];
6 int ans[15];
7 int dfs(int num,int n){
8 int cnt=0;
9 if(num==0){
10 return 1;
11 }
12 for(int i=1;i<=n;i++){
13 if(flag[i]||vis[0][i-num+n]||vis[1][i+num]){
14 continue;
15 }
16 flag[i]=vis[0][i-num+n]=vis[1][i+num]=1;
17 cnt+=dfs(num-1,n);
18 flag[i]=vis[0][i-num+n]=vis[1][i+num]=0;
19 }
20 return cnt;
21 }
22 int main(){
23 for(int i=1;i<=10;i++){ //因为不知道询问多少次,所以先打表
24 memset(vis,0,sizeof(vis));
25 memset(flag,0,sizeof(flag));
26 ans[i]=dfs(i,i);
27 }
28 int n;
29 while(cin>>n){
30 memset(flag,0,sizeof(flag));
31 memset(vis,0,sizeof(vis));
32 if(n==0){
33 break;
34 }
35 cout<<ans[n]<<endl;
36 }
37 return 0;
38 }