POJ - 1321 棋盘问题 (简单dfs)

棋盘问题

原题链接:http://poj.org/problem?id=1321

题目大意:

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。

解题思路:

简单dfs,按照列的顺序搜索,并使用vis标记每行是否有棋子。

代码:

 1 #include <iostream>
 2 #include <stdio.h>
 3 using namespace std;
 4 #define debug(a) cout<<#a<<":"<<a<<endl;
 5 typedef long long ll;
 6 const int INF=1e9+7;
 7 const int N=1e6+7;
 8 const int mod=1e9+7;
 9 int maxn,minn;
10 int T,n,k;
11 int ans=0;
12 int vis[100];
13 char mp[100][100];
14 
15 void dfs(int a,int b){
16     if(b==k){
17         ans++;
18         return ;
19     }
20     else if(a==n+1){
21         return ;
22     }
23     for(int i=1;i<=n;i++){
24         if(vis[i]==0&&mp[a][i]=='#'){
25             vis[i]=1;
26             dfs(a+1,b+1);
27             vis[i]=0;
28         }
29     }
30     dfs(a+1,b);
31 }
32 
33 
34 int main(){
35     while(cin>>n>>k){
36         ans=0;
37         if(n==-1&&k==-1){
38             break;
39         }
40         for(int i=1;i<=n;i++){
41             scanf("%s",mp[i]+1);
42         }
43         dfs(1,0);
44         cout<<ans<<endl;
45     }
46     
47 
48     return 0;
49 }

猜你喜欢

转载自www.cnblogs.com/meanttobe/p/12519979.html
今日推荐