中文题意、、、不解释。。要理解DFS的精髓。。不然是做不出来的。。
#include <iostream>
using namespace std;
char map[8][8];
int vis[8];
int n,sum,m;//sum为方案数,m为棋子数
void dfs(int hang,int step)
{
int i;
if(step==m)//step是当前放的棋子的数目,如果step==m,则方案数加1,进入下个DFS
{
sum++;
return;
}
if(hang>n)//行比N大的话就退出
return ;
for(i=0;i<n;i++)
{
if(vis[i]==0&&map[hang][i]=='#')
{
vis[i]=1;
dfs(hang+1,step+1);
vis[i]=0;//回溯
}
}
dfs(hang+1,step);//如果这行没有找到#,则进入下一行。。
}
int main()
{
int i,j;
while(cin>>n>>m)
{
if(n==-1&&m==-1)
break;
sum=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cin>>map[i][j];
}
memset(vis,0,sizeof(vis));
dfs(0,0);//从第0行开始深搜。。
cout<<sum<<endl;
}
return 0;
}