#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
int ss[1005][1005];
int vis[1005][1005];
int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};
int x1, y1, x2, y2, n, m;
int fi;
int isin(int x, int y)
{
return x >= 1 && x <= n && y >= 1 && y <= m;
}
int dfs(int x, int y, int cnt, int di)
{
if(fi) return 1;
vis[x][y] = 1;
if(cnt > 2) return 0;
if(cnt == 2 && x - x2 != 0 && y - y2 != 0) //最重要的剪枝
return 0;
for(int i = 0; i < 4; i++)
{
int ans;
int tempx = x + dir[i][0];
int tempy = y + dir[i][1];
if( i == di)
ans = cnt;
else
ans = cnt + 1;
if(!isin(tempx, tempy) || vis[tempx][tempy]) continue;
if(tempx == x2 && tempy == y2 && ans <= 2)
{
fi = 1;
return 1;
}
if(!ss[tempx][tempy]){
if(di == 5) ans = 0;
if(dfs(tempx, tempy, ans, i))
return 1;
else
vis[tempx][tempy] = 0;
}
}
return 0;
}
int main()
{
while(cin>>n>>m)
{
if(!n && !m) break;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
scanf("%d", &ss[i][j]);
int q;
cin>>q;
for(int i = 0; i < q; i++)
{
fi = 0;
memset(vis, 0, sizeof vis);
cin>>x1>>y1>>x2>>y2;
if(ss[x1][y1] == 0 || ss[x2][y2] == 0){
cout<<"NO"<<endl;
continue;
}
else if(ss[x1][y1] != ss[x2][y2]){
cout<<"NO"<<endl;
continue;
}
else {
if(dfs(x1, y1, 0, 5))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
}
return 0;
}
HDU 1175(搜索DFS)
最新推荐文章于 2019-04-29 18:59:33 发布