题目链接:
http://poj.org/problem?id=1321
解题思路:
思路在代码里写的很清楚了。。。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,m;
char node[10][10];
int vis[10];
int ans;
void dfs(int row,int sum){
if(sum == m){
ans++;
return;
}
if(row > n)
return;
for(int j = 1; j <= n; j++){
if(node[row][j] == '#' && !vis[j]){
vis[j] = 1;
dfs(row+1,sum+1);
vis[j] = 0;
}
}
dfs(row+1,sum);
//这步很关键,想上去了,这题就成了水题,想不上去的话。。。
//当k<n时,row在等于n之前就可能已经把全部棋子放好
//又由于当全部棋子都放好后的某个棋盘状态已经在前面循环时记录了
//因此为了处理多余行,令当前位置先不放棋子,搜索在下一行放棋子的情况
}
int main(){
while(~scanf("%d%d",&n,&m)){
if(n+m < 0)
break;
for(int i = 1; i <= n; i++)
scanf("%s",node[i]+1);
ans = 0;
memset(vis,0,sizeof(vis));
dfs(1,0);
printf("%d\n",ans);
}
return 0;
}