wa一路。。。蒙圈了,到最后还是a了,很简单一个题,只不过脑子混乱了。
思路:
用深度搜索即可!
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n, k, ans;
char str[10][10];
int vis[100];
void dfs(int x, int k) //x代表位置即第几行 k代表放的棋子的个数
{
if(k==0) //当所有点都放完时,结束
{
ans++;
return;
}
for(int i=x; i<n; i++)
{
for(int j=0; j<n; j++)
{
if(str[i][j]=='#' && vis[j]==0) //条件 此点可放棋子而且还未放
{
vis[j] = 1;
dfs(i+1, k-1); //下一行继续搜索,k需要减去一
vis[j] = 0;
}
}
}
}
int main()
{
while(1)
{
scanf("%d %d", &n, &k);
if(n==-1 && k==-1) break;
memset(vis, 0, sizeof(vis));
ans = 0;
getchar();
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
str[i][j] = getchar();
getchar();
}
dfs(0, k);
printf("%d\n", ans);
}
return 0;
}