深搜,构思出解答树,基本不难...好久没写了,一开始写的没过,看着别人的解题报告启发。。。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int cnt;
int main()
{
void dfs(char chess[][10],int n,int k,int row,int key,bool flag[]);
int n,k,key;
char chess[10][10];
bool flag[10];
while(scanf("%d %d",&n,&k) && n != -1 && k != -1)
{
memset(flag,false,sizeof(flag));//列数的标记数组
cnt = 0,key = 0;
for(int i = 0 ; i < n ; i++)
{
getchar();
for(int j = 0 ; j < n ; j++)
{
cin>>chess[i][j];
}
}
dfs(chess,n,k,0,0,flag);
cout<<cnt<<endl;
}
return 0;
}
void dfs(char chess[][10],int n,int k,int row,int key,bool flag[])
{
if(key == k)
{
cnt++;
return;
}
if(row > n)
{
return;
}
for(int j = 0 ; j < n ; j++)
{
if(chess[row][j] == '#' && !flag[j])
{
flag[j] = true;
dfs(chess,n,k,row+1,key+1,flag); //下一行中有符合条件的位置,row,key分别+1 继续搜索
flag[j] = false;
}
}
dfs(chess,n,k,row+1,key,flag);//下一行中没有符合要求的位置,只把row+1,key不变
}
//深搜,构造出解答树,根据解答树的特征来写出深搜