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 }

 

 

posted on 2013-06-04 21:04  行者1992  阅读(385)  评论(0编辑  收藏  举报