点击打开链接
//dfs枚举各种情况
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=10+5;
char field[maxn][maxn];
int cnt,sum; //已摆放棋子个数及总方案个数
int n,k;
bool done[maxn]; //记录某一列是否安放棋子
void dfs(int s) //s为行数
{
if(cnt==k) {
sum++;
return;
}
else {
if(s>=n) return;
else {
for(int i=0;i<n;i++)
if(field[s][i]=='#'&&!done[i]) { //可以进行安放
done[i]=true;
cnt++;
dfs(s+1);
cnt--;
done[i]=false;
}
dfs(s+1);
}
}
}
int main()
{
while(scanf("%d%d",&n,&k)==2)
{
if(n==-1&&k==-1) break;
for(int i=0;i<n;i++)
scanf("%s",&field[i]);
cnt=sum=0;
memset(done,false,sizeof(done));
dfs(0);
printf("%d\n",sum);
}
return 0;
}
poj 1321 棋子填放
最新推荐文章于 2024-07-12 18:56:03 发布