棋盘问题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

 

你可能感兴趣的:(poj)