zoj 2110(hdu 1010)Tempter of the Bone(深搜)

一道很陈的搜索题了,深搜实现的,但我还是发现了一些之前没有注意的地方……

 

第一,全局变量的赋值应该注意……………………。

第二,就是搜索的优化剪枝问题,这种题很容易超时。

下面是代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
int dir[4][2]={-1,0,1,0,0,1,0,-1};
int n,m,t,si,sj,di,dj,wall=0,flag=0;
char map[9][9];
void getmap()
{
	int i,j;
	wall=0;
	for(i=0;i<n;i++)
		for(j=0;j<m;j++)
		{
			scanf("%1s",&map[i][j]);
			if(map[i][j]=='S'){ si=i; sj=j; }
			if(map[i][j]=='D'){ di=i; dj=j; }
			if(map[i][j]=='X')wall++;
		}
}
void dfs(int a,int b,int cnt)
{
	int i,temp;
	if(a<0||b<0||a>n-1||b>m-1)return;
	if(a==di&&b==dj&&cnt==t) flag=1;
	if(flag) return;
	temp=t-cnt-abs(a-di)-abs(b-dj); //剪枝
	if(temp<0||temp&1)return;  //temp为负数或奇数时,无法到达
	for(i=0;i<4;i++)
	{
		if(map[ a+dir[i][0] ][ b+dir[i][1] ]!='X')
		{
			map[ a+dir[i][0] ][ b+dir[i][1] ]='X';
			dfs(a+dir[i][0],b+dir[i][1],cnt+1);
			map[ a+dir[i][0] ][ b+dir[i][1] ]='.';
		}
	}
	return;
}
int main()
{
	while(scanf("%d%d%d",&n,&m,&t),n)
	{
		wall=0;
		getmap();
		if(n*m-wall-1<t) //剪枝
		{
			printf("NO/n");continue;
		}
		flag=0;
		map[si][sj]='X';
		dfs(si,sj,0);
		if(flag==1) printf("YES/n");
		else printf("NO/n");
	}
	return 0;
}


你可能感兴趣的:(优化,ini)