hdu 2553
N皇后问题
http://acm.hdu.edu.cn/showproblem.php?pid=2553
经典深搜:在棋盘上放置棋子,行、列、斜45度不重复
1 #include <iostream>
2 #include <stdio.h>
3 #include <string.h>
4 #include <math.h>
5
6 using namespace std;
7 int count[15];//n的最大范围是10,打表!
8 int cal;//k个大小的棋盘放的数目
9 int map[15][15];//棋盘
10
11 bool dfs(int row,int column,int k)
12 {
13 //最后一行也合适,放置数目加1
14 if(row>k)
15 {
16 cal++;
17 return 1;
18 }
19 //判断同一列是否有棋子
20 for(int i=1;i<row;i++)
21 if(map[i][column])
22 return 0;
23 //判断左上45度是否有棋子
24 for(int i=row-1,j=column-1;i>0&&j>0;i--,j--)
25 {
26 if(map[i][j])
27 return 0;
28 }
29 //判断右上45度是否有棋子
30 for(int i=row-1,j=column+1;i>0&&j<=k;i--,j++)
31 {
32 if(map[i][j])
33 return 0;
34 }
35 //都通过,该点合适并判断下一行
36 map[row][column]=1;
37 for(int i=1;i<=k;i++)
38 {
39 //当dfs(row+1,i,k)为1时,改行为最后一行,棋盘已放满
40 if(dfs(row+1,i,k))
41 break;
42 }
43 //该点判断完成,恢复后再去判断其他点
44 map[row][column]=0;
45 return 0;
46 }
47 int main()
48 {
49 memset(map,0,sizeof(map));
50 for(int k=1;k<=10;k++)
51 {
52 cal=0;
53 count[k]=0;
54 for(int i=1;i<=k;i++)
55 dfs(1,i,k);
56 count[k]=cal;
57 }
58 //for(int i=1;i<=10;i++)
59 //printf("%d %d\n",i,count[i]);
60 int n;
61 while(scanf("%d",&n)!=EOF)
62 {
63 if(n==0)
64 break;
65 printf("%d\n",count[n]);
66 }
67 return 0;
68 }