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

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

 

转载于:https://www.cnblogs.com/mengchunchen/p/4506778.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值