棋盘问题

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;

}

 

你可能感兴趣的:(问题)