zoj 2110 Tempter of the Bone (dfs搜索)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1110

 

结题报告:搜索中的一个重要的剪枝,现在记录下来,作为一个积累; 

起点到终点的距离即sx-ex+sy-ey如果是奇数, 则题目中所给定的时间一定是只有奇数才可能得到结果,如果题目中的起点到终点的距离如果是偶数,则题目中给的时间如果是偶数才可能得到想要的结果。如何优化题目代码已经标记:

 

 

#include<cstdio>
#include<cstring>
using namespace std;

const int maxn = 10;
int n,m,t,step,flag;
int dir[4][2]={0,-1,0,1,1,0,-1,0};
char mp[maxn][maxn];
int sx,sy,ex,ey;

void dfs(int d,int r,int s)
{
	if(d<0||d>=n||r<0||r>=m) return ;
	if(ex==d&&ey==r&&s==t)
	{
		flag = 1;
		return s;
	}
	for(int i=0;i<4;i++)
	{
		int xx=d+dir[i][0];
		int yy=r+dir[i][1];
		if(mp[xx][yy] != 'X')
		{
			mp[xx][yy]='X';
			dfs(xx,yy,s+1);
			if(flag) return 1;
			mp[xx][yy]='.';
		}
	}
	return s ;
}

int main()
{
	int cnt ;
	while(scanf("%d %d %d",&n,&m,&t)!=EOF)
	{
		cnt=0;
		if(!(n || m || t)) break;
		for(int i=0;i<n;i++)
		{
			scanf("%s",mp[i]);	
			for(int j=0;j<m;j++)
			{
				if(mp[i][j] == 'S')
				{
					sx=i;
					sy=j;
				}
				if(mp[i][j] == 'D')
				{
					ex=i;
					ey=j;
				}
				if(mp[i][j]=='X')
					cnt++;
			}
		}
		if(n*m-cnt<=t)
		{
			printf("NO\n");
			continue;
		}
		int temp = t-(sx-ex+sy-ey);
		if(temp <0||temp%2)//一个重要的优化 
		{
			printf("NO\n");
			continue;
		} 
		flag = 0;
		mp[sx][sy]='X';
		dfs(sx,sy,0);
		if(flag) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
} 

 

你可能感兴趣的:(DFS,索搜)