题意:http://poj.org/problem?id=1321 汉语题。
思路:每一种情况要遍历。所以需要搜索,而dfs需要简化步骤。
1. 每一行遍历,避免重复。
2. 考虑出现n > k的情况。
3. 思路需要理清。
/*
dfs回味无穷
*/
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n,m;
int c[10][10];
int L[10]; //标记每一列是否有棋子
int ans = 0;
void dfs(int x,int num)
{
if(num == m){
ans++;
return ;
}
if(x > n)
return ;
for(int i = 1;i <= n; i++){
if(c[x][i] && !L[i]){
L[i] = true;
dfs(x+1,num+1);
L[i] = false; //回溯
}
}
dfs(x+1,num); //解决了n > k的情况
return ;
}
int main()
{
// freopen("in.txt","r",stdin);
while(cin>>n>>m){
if(n == -1 && m == -1)
break;
memset(c,0,sizeof(c));
memset(L,0,sizeof(L));
for(int i = 1;i <= n; i++){
for(int j = 1;j <= n; j++){
char s;
cin>>s;
if(s == '#')
c[i][j] = true;
else
c[i][j] = false;
}
}
ans = 0;
dfs(1,0);
cout<<ans<<endl;
}
return 0;
}