hdu 1010 (DFS+剪枝)

点击打开链接

分析:

BFS,DFS,都可以,只要拍注意剪枝就可以了。

注意题目中要求只能在T秒到D。

题目中有坑。测试数据中每行有多余的空格。。。就这一点卡了一个晚上


#include"stdio.h"
#include"string.h"
#include"math.h"
#define zz 10

int mark[zz][zz];
char map[zz][zz];
int n,m,t,s,e,ss,ee,f;
int dir[4][2]={1,0,0,1,-1,0,0,-1};

void dfs(int x,int y,int t)
{
	int i,dis;
	int xx,yy;
	if(x==ss&&y==ee)
	{
		if(t==0)f=1;
		return ;
	}
	if(f==1)return ;
	dis=abs(x-ss)+abs(y-ee);
	if(dis>t||(t-dis)%2!=0)return ;
	for(i=0;i<4;i++)
	{
		xx=x+dir[i][0];
		yy=y+dir[i][1];
		if(xx>=0&&xx<n&&yy>=0&&yy<m&&!mark[xx][yy]&&map[xx][yy]!='X')
		{
			mark[xx][yy]=1;
			dfs(xx,yy,t-1);
			mark[xx][yy]=0;
		}
	}
}

int main()
{
	int i,j,k;
	while(scanf("%d %d %d%*c",&n,&m,&t)!=-1&&(n+m+t))
	{
		k=0;
		memset(map,0,sizeof(map));
		memset(mark,0,sizeof(mark));
		for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++)
			{
				scanf("%c",&map[i][j]);
				if(map[i][j]=='S')
					s=i,e=j;
				if(map[i][j]=='D')
					ss=i,ee=j,k++;
				if(map[i][j]=='.')
					k++;
			}
			scanf("%*c");
		}
		
		if(k<t)
		{
			printf("NO\n");
			continue;
		}
		f=0;
		mark[s][e]=1;
		dfs(s,e,t);
		if(f==1)printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}


你可能感兴趣的:(hdu 1010 (DFS+剪枝))