题目链接:点击打开链接
中文题,题意就不说了,逐行搜索,记录步数,标记列,注意考虑不放棋子的情况。
//164K 47MS
//C++ 589B
#include <cstdio>
#include <cstring>
int n,m,sum;
char map[8][8];
int vis[8];
void dfs(int i,int k)
{
if(k==m)
{
sum++;
return; //摆放完毕退出
}
if(i>=n) return; //越界退出
for(int j=0;j<n;j++)
{
if(map[i][j]=='#'&&!vis[j])
{
vis[j]=1;
dfs(i+1,k+1); //本行在j处放棋子搜索下一行
vis[j]=0; //这个很容易忘啊。。。
}
}
dfs(i+1,k); //本行不放棋子
}
int main()
{
int i;
while(~scanf("%d%d",&n,&m)&&(n!=-1&&m!=-1))
{
sum=0;
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++)
{
scanf("%s",map[i]);
}
dfs(0,0);
printf("%d\n",sum);
}
return 0;
}