棋盘问题
原题链接: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 }