#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int n,m,Map[1005][1005],vis[1005][1005];
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int xx,yy,x2,y2;
bool flag;
bool check(int x,int y){
if(!vis[x][y]&&x>0&&y>0&&x<=n&&y<=m)
return true;
return false;
}
void dfs(int x,int y,int t,int cnt){
if(cnt>2)
return;
if(x!=xx||y!=yy){
if((x!=x2||y!=y2)&&Map[x][y]!=0) //不是终点,但是存在值,绕过
return;
if(cnt==2&&x!=x2&&y!=y2) //cnt==2,此时如果还没有找到,则必须停止,因为必须转折一次才能够找到终点
return;
}
if(x==x2&&y==y2){
flag=true;
return;
}
for(int i=0;i<4;i++){
int nx=x+dir[i][0];
int ny=y+dir[i][1];
if(check(nx,ny)){
if(x==xx&&y==yy){
vis[nx][ny]=1;
dfs(nx,ny,i,cnt);
vis[nx][ny]=0;
}
else {
vis[nx][ny]=1;
if(t!=i)
dfs(nx,ny,i,cnt+1);
else
dfs(nx,ny,i,cnt);
vis[nx][ny]=0;
}
}
}
}
int main(){
while(cin>>n>>m&&n){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&Map[i][j]);
}
}
int q;
scanf("%d",&q);
while(q--){
scanf("%d%d%d%d",&xx,&yy,&x2,&y2);
memset(vis,0,sizeof(vis));
flag=false;
if(Map[xx][yy]==Map[x2][y2]&&Map[xx][yy]!=0){
dfs(xx,yy,0,0);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
else{
printf("NO\n");
}
}
}
return 0;
}
HDU - 1175 连连看 dfs+剪枝
最新推荐文章于 2021-04-17 12:07:26 发布
本文详细解析了一款连连看游戏的实现算法,采用深度优先搜索(DFS)来判断两个方块是否可以通过连线消除。通过递归的方式遍历所有可能路径,并设置特定条件避免不必要的搜索,确保算法效率。

247

被折叠的 条评论
为什么被折叠?



