poj1321 基础DFS

最近两天在写搜索专题

题意:中文题就不用讲题意

思路:由于每行每列只允许最多一个棋子,那么我们可以从第一行开始往下搜索,并标记列,如果这列放了就不放,否则就放,并向下层搜索,这样可以不用标记行了。

#include<stdio.h>
#include<string.h>
int n,sum,m;
const int maxn = 10;
char map[maxn][maxn];
int visc[maxn];

void DFS(int r,int k)
{
	if(k == m)
	{
		sum ++;
		return ;
	}
	if(r >= n)return ;
	for(int i =0;i<n;i++)
	{
		if(!visc[i] && map[r][i] == '#')
		{
			visc[i] = 1;
			DFS(r+1,k+1);
			visc[i] = 0;
		}
	}
	DFS(r+1,k);
}
int main()
{
	while(scanf("%d%d",&n,&m),n+1+m+1)
	{
		sum = 0;
		memset(visc,0,sizeof(visc));
		for(int i=0;i<n;i++)
		{
			scanf("%s",map[i]);
		}
		DFS(0,0);
		printf("%d\n",sum);
	}
	return 0;
}

posted on 2014-07-23 21:32  黎昊明  阅读(135)  评论(0编辑  收藏  举报

导航