棋盘问题poj1321

直接上代码吧。

 

代码
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4
5  /*思路比较简单,而且也没什么原创,纯属练手了,下次再做一个稍微复杂点的*/
6  //主要是以行(row)为顺序来进行深度优先遍历
7
8 char board[8][8];
9
10 int col[8];
11
12 int count;
13
14 int n,k;
15
16
17 void dfs(row,left)
18 {
19 int i;
20 for(i=0;i<n;i++)
21 {
22 if(board[row][i]=='#')
23 {
24 if(!col[i])
25 {
26 //成功情况
27 if(left==1)
28 {
29 count++;
30 }
31 else
32 {
33 int j;
34 col[i]=1;
35 //这里要处理的是剩余的行数大于剩余的棋子数问题
36 for(j=1;j<=n-row-left+1;j++)
37 dfs(row+j,left-1);
38 col[i]=0;
39 }
40 }
41 }
42 }
43 }
44
45
46 int main()
47 {
48 scanf("%d %d",&n,&k);
49 char line;//get the \n to skip it
50 int i,j;
51 scanf("%c",&line);
52 for(i=0;i<n;i++)
53 {
54 for(j=0;j<n;j++)
55 {
56 scanf("%c",&board[i][j]);
57 //printf("got %c : %d\n",board[i][j],board[i][j]);
58 }
59 scanf("%c",&line);
60 }
61
62 for(i=0;i<n;i++)
63 col[i]=0;
64 count=0;
65 for(i=0;i<=n-k;i++)
66 {
67 dfs(0+i,k);
68 }
69 printf("%d\n",count);
70 }
71

 

posted on 2010-11-10 10:52  Weifeng Wang  阅读(440)  评论(0编辑  收藏  举报

导航