码迷,mamicode.com
首页 > 其他好文 > 详细

poj 1321 棋盘问题(n行中放任意k行)

时间:2015-05-15 21:16:10      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:

n*n的棋盘摆K的棋子,任意两个棋子不能在同一行同一列

Sample Input

2 1
#.  //# 可放
.#
4 4
...#
..#.
.#..
#...
-1 -1
Sample Output

2
1

 

技术分享
 1 # include <cstdio>
 2 # include <cstring>
 3 # include <iostream>
 4 using namespace std ;
 5 
 6 int map[10][10] ;
 7 int x[10] ;
 8 int sum ;
 9 int n , k ;
10 
11 void DFS(int src , int num) //逐行搜索,src为当前搜索行,num为已填充的棋子数  
12 {
13     int i , j ;
14     if (num == k)
15       {
16         sum++ ;
17         return ;
18       }
19       
20     if (src > n)
21        return ;
22     for (i = 1 ; i <= n ; i++)
23     {
24         if (map[src][i] && !x[i])
25         {
26             x[i] = 1 ;
27             DFS(src+1 , num+1) ;
28             x[i] = 0 ;
29         }
30     }
31     DFS(src+1 ,num) ; //这里是难点,当k<n时,src在等于n之前就可能已经把全部棋子放好 
32                        //又由于当全部棋子都放好后的某个棋盘状态已经在前面循环时记录了 
33                        //因此为了处理多余行,令当前位置先不放棋子,搜索在下一行放棋子的情况 
34     
35 }
36 
37 int main ()
38 {
39 
40     while(scanf("%d %d" , &n , &k) != EOF)
41     {
42         if (n == -1 && k == -1)
43         {
44             break ;
45         }
46         int i , j ;
47         char ch ;
48         sum = 0 ;
49         memset(x , 0 , sizeof(x)) ;
50         memset(map , 0 , sizeof(map)) ;
51         for (i = 1 ; i <= n ; i++)
52            for (j = 1 ; j <= n ; j++)
53                {
54                       cin>>ch ;
55                       if (ch == #)
56                           map[i][j] = 1 ;
57                }
58         
59         DFS(1 , 0) ;
60         printf("%d\n" , sum) ;
61     }
62     
63     
64     return 0 ;
65 }
View Code

 

poj 1321 棋盘问题(n行中放任意k行)

标签:

原文地址:http://www.cnblogs.com/-Buff-/p/4506778.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!