poj 1321

题目大意:

解决:dfs+回溯,类似于八皇后问题,分两种情况,第n行放或者不放,放的话回溯,不放的话直接进入下一行

#include <iostream>
#include <cstdio>
using namespace std;
int cnt,n,k;
char map[10][10];
int r[10],c[10];

void dfs(int cur_step,int cur_cnt)
{ 
   if(cur_cnt == k){cnt++;return;}
   if(cur_step == n)return;
   for(int i=0;i<n;i++)
   {
         if(map[cur_step][i]=='#' && !r[cur_step] && !c[i])
         {
              r[cur_step]=1;
              c[i]=1;
              dfs(cur_step+1,cur_cnt+1);
              r[cur_step]=0;
              c[i]=0;  
         }
   }
   //由于是多行,可能某一行不用放,这种情况是解决在cur_step行没放
 //而直接进入下一行的情况
   dfs(cur_step+1,cur_cnt);
}

int main()
{
    while(scanf("%d%d",&n,&k), n!=-1 && k!=-1)
    {
        memset(r,0,sizeof(r));
        memset(c,0,sizeof(c));
        cnt=0;
        int i;
        for(i = 0; i < n; i++)scanf("%s",map[i]);
        dfs(0,0);  
        printf("%d\n",cnt);
    }
    system("pause");
    return 0;
}

 

posted on 2011-09-07 21:23  猿类的进化史  阅读(212)  评论(0编辑  收藏  举报