hdu1175

/*
分析:

    简单深搜,62MS。

    因为转折数不能超过两次,所以对于1000*1000的,不出意外深搜可行。

犯2了。。。一开始传递的d=-1,所以代码行49里面,应该是
“if(i!=d&&d!=-1)”而不是“if(i!=d)”,白WA了好几次。
记性真差,以后将有必要的点儿都写下来,记一下,要不再犯
这种错误,而且没有检查出来,不是2死了么。。。

    没啥说的,对于搜索还是要注意剪枝吧,这个很~重要。

  思路:
    没啥说的,代码挺清晰的。

                                                2012-04-25
*/







#include"stdio.h"
#include"string.h"
int num[1011][1011];
int flag[1011][1011];
int n,m;
int ans;
int x_end,y_end;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
void DFS(int x,int y,int times,int d)
{
	int i;
	int next_x,next_y;
	
	///判断1
	if(ans==1)
		return ;
	if(times>2)
		return ;
	if(times==2&&x-x_end!=0&&y-y_end!=0)    //一会儿试试把这个去掉时间会加多少。   An:不去62MS,去了,7765MS。。。
		return ;

	///判断2
	if(x==x_end&&y==y_end&×<=2)
	{
		ans=1;
		return ;
	}

	///搜索
	for(i=0;i<4;i++)
	{
		next_x=x+dir[i][0];
		next_y=y+dir[i][1];
		if(next_x<=0||next_x>n||next_y<=0||next_y>m)
			continue;
		if(next_x==x_end&&next_y==y_end)
			;
		else if(num[next_x][next_y]!=0)
			continue;
		if(flag[next_x][next_y]!=0)
			continue;
		if(d==-1)           //这个怎么优化?这个判断只在第一次DFS的时候用到了,只用了一次。
			;
		else if(i!=d)
			times++;
		flag[next_x][next_y]=1;
		DFS(next_x,next_y,times,i);
		flag[next_x][next_y]=0;
		if(i!=d&&d!=-1)
			times--;
	}
}
int main()
{
	int i,l;
	int q;
	int x_start,y_start;
	while(scanf("%d%d",&n,&m),m||n)
	{
		memset(flag,0,sizeof(flag));

		for(i=1;i<=n;i++)
		{
			for(l=1;l<=m;l++)
				scanf("%d",&num[i][l]);
		}

		scanf("%d",&q);
		for(i=0;i<q;i++)
		{
			scanf("%d%d%d%d",&x_start,&y_start,&x_end,&y_end);
			if(x_start==x_end&&y_start==y_end)
			{				
				printf("NO\n");
				continue;
			}
			if(num[x_start][y_start]!=num[x_end][y_end]||num[x_start][y_start]==0||num[x_end][y_end]==0)
			{
				printf("NO\n");
				continue;
			}
			ans=0;
			flag[x_start][y_start]=1;
			DFS(x_start,y_start,0,-1);
			flag[x_start][y_start]=0;
			if(ans==1)
				printf("YES\n");
			else
				printf("NO\n");
		}
	}
	return 0;
}


你可能感兴趣的:(hdu1175)