题目大概:
输入多组数据,每组数据有n,,k,表示一个n*n的矩形,由点和#组成,k个东西可以放到#的位置,问有多少种方法。
思路:
用深度优先搜索。
先放第一个,然后第二个。。。依次放好。
并做好标记,当本行放完就转到下一行,当这一列放好就做上标记
当行数小于零时,说明这种方法不行了。
当k个东西都放完时,方法数加一。
代码:
已更新
#include <cstdio>
#include <cstring>
using namespace std;
long long sum=0;
int n,k;
char Map[10][10];
bool vis[10];
void dfs(int x,int ans)
{
if(ans==k)
{
sum++;
return;
}
if(x>n)return;
for(int j=1;j<=n;j++)
{
if(Map[x][j]=='#'&&!vis[j])
{
vis[j]=1;
dfs(x+1,ans+1);
vis[j]=0;
}
}
dfs(x+1,ans);
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(scanf("%d%d",&n,&k)&&n!=-1&&k!=-1)
{
sum=0;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
scanf("%s",Map[i]+1);
}
dfs(1,0);
printf("%lld\n",sum);
}
return 0;
}