中文题意、、、不解释。。要理解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;
}

posted on 2011-09-02 11:19  →木头←  阅读(119)  评论(0编辑  收藏  举报