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;
}
浙公网安备 33010602011771号