题目链接:http://poj.org/problem?id=1321
解题方法:dfs解题,可以按行开始放棋子,每次放完做一个标记,表示当前列已经放了棋子,接下来该列不能再放棋子了。至于如何使用dfs就看代码中的注释吧。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<stack>
#include<cstdio>
#include<map>
#include<set>
#include<string>
#include<queue>
using namespace std;
#define inf 0x3f3f3f3f
char mp[10][10];
int ans;
int n,k;
int use[10];//第i行是否已被安放棋子
void dfs(int a,int b){//从第a行开始放棋子,还需放b颗棋子
if(b==0)
{
ans++;
return ;
}
if(a>n)
return ;
for(int i=0;i<n;i++){
if(!use[i]&&mp[a][i]=='#'){
use[i]=1;
dfs(a+1,b-1);
use[i]=0;
}
}
dfs(a+1,b);//可能第a行不能放棋子
}
int main(){
while(scanf("%d%d",&n,&k)&&!(n==-1&&k==-1)){
ans=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>mp[i][j];
}
}
dfs(0,k);
printf("%d\n",ans);
}
return 0;
}