#include <iostream>
#include <math.h>
#include <algorithm>
#include <string.h>
using namespace std;
int g[1010][1010];
int vis[1010][1010];
int flag, n, m, sx, sy, ex, ey;
void dfs(int x, int y, int cnt, int dire)
{
if(x < 0 || y < 0 || x >= n || y >= m) return ;
if(x == ex && y == ey)
flag = 1;
if(flag) return ;
if(cnt>2) return ;
if(cnt == 2)
{
if(! ((dire == 1 && (ex < x && ey == y)) || (dire == 2 && (x < ex && ey == y)) || (dire == 3 && (y > ey && ex == x)) || (dire == 4 && (y < ey && ex == x))))
return ;
}
if(g[x][y] != 0) return ;
if(vis[x][y]) return ;
vis[x][y] = 1;
if(dire == 1)
{
dfs(x-1, y, cnt, 1);
dfs(x+1, y, cnt+1, 2);
dfs(x, y-1, cnt+1, 3);
dfs(x, y+1, cnt+1, 4);
}
else if(dire == 2)
{
dfs(x-1, y, cnt+1, 1);
dfs(x+1, y, cnt, 2);
dfs(x, y-1, cnt+1, 3);
dfs(x, y+1, cnt+1, 4);
}
else if(dire == 3)
{
dfs(x-1, y, cnt+1, 1);
dfs(x+1, y, cnt+1, 2);
dfs(x, y-1, cnt, 3);
dfs(x, y+1, cnt+1, 4);
}
else if(dire == 4)
{
dfs(x-1, y, cnt+1, 1);
dfs(x+1, y, cnt+1, 2);
dfs(x, y-1, cnt+1, 3);
dfs(x, y+1, cnt, 4);
}
vis[x][y] = 0;
}
int main()
{
while(1)
{
scanf("%d%d", &n, &m);
if(n == 0 && m == 0) break;
for(int i = 0; i < n; i ++)
for(int j = 0; j < m; j ++)
scanf("%d", &g[i][j]);
int q;
scanf("%d", &q);
while(q--)
{
memset(vis, 0, sizeof(vis));
flag = 0;
scanf("%d%d%d%d", &sx, &sy, &ex, &ey);
sx--,sy--,ex--,ey--;
if(sx == ex && sy == ey && g[sx][sy])
{
puts("NO");
continue;
}
else if(g[sx][sy] == g[ex][ey] && g[ex][ey])
{
dfs(sx-1, sy, 0, 1); //上
dfs(sx+1, sy, 0, 2); //下
dfs(sx, sy-1, 0, 3); //左
dfs(sx, sy+1, 0, 4); //右
if(flag) puts("YES");
else puts("NO");
}
else puts("NO");
}
}
return 0;
}
【DFS】hdu 1175 连连看
最新推荐文章于 2021-07-18 10:33:50 发布