题目是中文的所以不过多解释,(代码内有详解)直接上码:
#include<iostream>
using namespace std;
int n,k,C;//输入棋盘的长以及棋子的数量
char build[20][20];//判定是否可以放下棋子
bool allow[20];//判定是否走过
int DFS(int x,int y)
{
if(y >= k)//若是棋子用完的话
{
C++;
return 0;
}
for(int i=x;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(allow[j] && build[i][j] == '#')
{
allow[j]=false;
DFS(i+1,y+1);//继续向下搜索 拿下一个棋子继续向下搜索
allow[j]=true;//别忘记复原
}
}
}
return 1;
}
int main()
{
while(cin>>n>>k)
{
if(n == -1 && k == -1 )
break;
if(k > n || n > 8)
break;
memset(allow,true,sizeof(allow));//集体初始化
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>build[i][j];
}
}
C=0;
DFS(0,0);
cout<<C<<endl;
}
return 1;
}