hdu 1175——连连看

深搜+剪枝

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

int map[1010][1010];
int dir[4][2]={-1,0,1,0,0,-1,0,1};// 上下 左右  

int flag;
int n,m;
int x1,x2,y1,y2; 

void dfs(int x,int y,int k,int d)
{
	int i,j;
	int temp;
	if(flag)
		return ;
	if(x==x2&&y==y2)
	{
		printf("YES\n");
		flag=1;
		return ;
	}
	
	if(map[x][y]==0&&x<n&&y<m&&x>=0&&y>=0&&k<=2)
	{
		if(k==0)
		{
			if(d==0||d==1)
			{
				if(y2-y<0)
				{
					temp=map[x][y];
					map[x][y]=-1;
					dfs(x+dir[2][0],y+dir[2][1],k+1,2);
					map[x][y]=temp;
				}
				if(y2-y>0)
				{
					temp=map[x][y];
					map[x][y]=-1;
					dfs(x+dir[3][0],y+dir[3][1],k+1,3);
					map[x][y]=temp;
				}
				if(y2==y)
				{
					if((x2-x<0&&d==1)||(x2-x>0&&d==0))
						return ;
					else
					{
						temp=map[x][y];
						map[x][y]=-1;
						dfs(x+dir[d][0],y+dir[d][1],k,d);
						map[x][y]=temp;
					}	
				}		
			}
			if(d==2||d==3)
			{
				if(x2-x<0)
				{
					temp=map[x][y];
					map[x][y]=-1;
					dfs(x+dir[0][0],y+dir[0][1],k+1,0);
					map[x][y]=temp;
				}
				if(x2-x>0)
				{
					temp=map[x][y];
					map[x][y]=-1;
					dfs(x+dir[1][0],y+dir[1][1],k+1,1);
					map[x][y]=temp;
				}
				if(x2==x)
				{
					if(y2-y<0&&d==3||y2-y>0&&d==2)
						return ;
					else
					{
						temp=map[x][y];
						map[x][y]=-1;
						dfs(x+dir[d][0],y+dir[d][1],k,d);
						map[x][y]=temp;
					}			
				}		
			}
			temp=map[x][y];
			map[x][y]=-1;
			dfs(x+dir[d][0],y+dir[d][1],k,d);
			map[x][y]=temp;
		}
		if(k==1)
		{
			if(d==0||d==1)
			{
				while(x!=x2)
				{
					if(map[x][y]!=0)
						return ;
					x=x+dir[d][0];
					y=y+dir[d][1];
				}
				
				if(y2-y>0)
				{
					while(y!=y2)
					{
						if(map[x][y]!=0)
							return ;
						x=x+dir[3][0];
						y=y+dir[3][1];
					}
				}
				if(y2-y<0)
				{
					while(y!=y2)
					{
						if(map[x][y]!=0)
							return ;
						x=x+dir[2][0];
						y=y+dir[2][1];
					}
				}
				if(y2==y)
				{
					printf("YES\n");
					flag=1;
					return ;
				}			
			}
			
			if(d==2||d==3)
			{
				while(y!=y2)
				{
					if(map[x][y]!=0)
						return ;
					x=x+dir[d][0];
					y=y+dir[d][1];
				}
				
				if(x2-x>0)
				{
					while(x!=x2)
					{
						if(map[x][y]!=0)
							return ;
						x=x+dir[1][0];
						y=y+dir[1][1];
					}
				}
				if(x2-x<0)
				{
					while(x!=x2)
					{
						if(map[x][y]!=0)
							return ;
						x=x+dir[0][0];
						y=y+dir[0][1];
					}
				}
				if(y2==y)
				{
					printf("YES\n");
					flag=1;
					return ;
				}			
			}	
		}
	}
}
int main()
{
	int i,j;
	int q;
	while(~scanf("%d%d",&n,&m)&&n+m)
	{
		for(i=0;i<n;i++)
			for(j=0;j<m;j++)
				scanf("%d",&map[i][j]);
			scanf("%d",&q);
			for(i=0;i<q;i++)
			{
				flag=0;
				scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
				x1--;
				x2--;
				y1--;
				y2--;
				if(map[x1][y1]==map[x2][y2]&&map[x1][y1]!=0&&map[x2][y2]!=0)
				{
					for(j=0;j<4;j++)
						dfs(x1+dir[j][0],y1+dir[j][1],0,j);//i代表方向 
					if(!flag)
						printf("NO\n");
				}
				else
					printf("NO\n");
			}
	}
	return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值