HDU_1175_dfs
阅读原文时间:2023年07月14日阅读:1

http://acm.hdu.edu.cn/showproblem.php?pid=1175

dfs(x,y,i,num),xy表示位置,i表示方向,num表示转向次数,num=2时候的剪枝很重要。

#include
#include
#include
using namespace std;
int a[][],vis[][],n,m,endx,endy,dis[][] = {{-,},{,-},{,},{,}},flag;

void dfs(int x,int y,int dir,int num)
{
if(flag) return;
if(x == endx && y == endy)
{
flag = ;
return;
}
if(num == )
{
if(dir == ||dir == )
{
if(y != endy) return;
}
else
{
if(x != endx) return;
}
}
int xx,yy;
for(int i = ;i < ;i++) { xx = x+dis[i][]; yy = y+dis[i][]; if(xx < || xx > n || yy < || yy > m || vis[xx][yy]) continue;
if(xx == endx && yy == endy || a[xx][yy] == )
{
vis[xx][yy] = ;
if(i == dir) dfs(xx,yy,dir,num);
else if(num < )dfs(xx,yy,i,num+);
vis[xx][yy] = ;
}
}

}
int main()
{
while(cin >> n >> m && n &&m)
{
flag = ;
for(int i = ;i <= n;i++) { for(int j = ;j <= m;j++) cin >> a[i][j];
}
int num;
cin >> num;
while(num--)
{
int beginx,beginy;
cin >> beginx >> beginy >> endx >> endy;
if(beginx == endx && beginy == endy || a[beginx][beginy] != a[endx][endy] || a[beginx][beginy] == )
{
cout << "NO" << endl;
continue;
}
flag = ;
memset(vis,,sizeof(vis));
for(int i = ;i < ;i++)
{
if(!flag) dfs(beginx,beginy,i,);
}
if(flag) cout << "YES" << endl;
else cout << "NO" << endl;
}
}
return ;
}