題目鏈接:點擊打開鏈接
中文題,題意就不說了,逐行搜索,記錄步數,標記列,注意考慮不放棋子的情況。
//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;
}