没啥困难的,bfs模板题,注意一下剪枝
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <cstdlib> #include <list> #include <set> #include <queue> #include <stack> using namespace std; #define maxn 1010 int map[maxn][maxn]; int vis[maxn][maxn]; int n,m; int d[4][2]={0,1,1,0,0,-1,-1,0}; struct point { int x,y; int num; int dir; }s,e; bool bfs() { queue<point>q; vis[s.x][s.y]=0; s.num=-1; s.dir=-1; q.push(s); while(!q.empty()) { point u=q.front(); q.pop(); if(u.x==e.x&&u.y==e.y&&u.num<=2) return 1; for(int i=0;i<4;i++) { point tmp; tmp.x=u.x+d[i][0]; tmp.y=u.y+d[i][1]; tmp.dir=i; tmp.num=u.num; if(tmp.x>=1&&tmp.x<=n&&tmp.y>=1&&tmp.y<=m&&(map[tmp.x][tmp.y]==0||tmp.x==e.x&&tmp.y==e.y)) { if(tmp.dir!=u.dir) { tmp.num=u.num+1; if(tmp.num>2) continue; if(vis[tmp.x][tmp.y]>=tmp.num) { vis[tmp.x][tmp.y]=tmp.num; q.push(tmp); } } else { if(vis[tmp.x][tmp.y]>=tmp.num) { vis[tmp.x][tmp.y]=tmp.num; q.push(tmp); } } } } } return 0; } int main() { int t,x1,x2,y1,y2; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%d",&map[i][j]); } } scanf("%d",&t); while(t--) { for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { vis[i][j]=4; } } scanf("%d%d%d%d",&s.x,&s.y,&e.x,&e.y); if(map[s.x][s.y]!=map[e.x][e.y]||map[s.x][s.y]==0||map[e.x][e.y]==0) printf("NO\n"); else if(bfs()) printf("YES\n"); else printf("NO\n"); } } return 0; }
时间: 2024-12-18 14:16:53