标签:set ++ gif name alt print cstring node cfa
难点在于判断转弯小于两次 这个还好
主要是 走过的路还能再走 但是去掉标记数组会超时
*******所以用 v.step<=f[v.x][v.y]即可!!! 这个思想非常重用!!
查了我一个小时的错误终于找出来了!!!!!!! !!!!!
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<iostream> using namespace std; int world[1005][1005]; int f[1005][1005]; int dx[4]={0,1,-1,0}; int dy[4]={1,0,0,-1}; int n,m;int sx,sy,ex,ey; struct node { int x,y,d1,chance; node(int x=0,int y=0,int d1=0,int chance=0):x(x),y(y),d1(d1),chance(chance){} }; void bfs() { memset(f,1,sizeof(f)); node u(sx,sy,-1,0); queue<node>q; q.push(u); while(!q.empty()) { node u=q.front();q.pop(); if(u.x==ex&&u.y==ey&&u.chance<=2){printf("YES\n");return ;} for(int i=0;i<4;i++) { node v(u.x+dx[i],u.y+dy[i],u.d1,u.chance); if(v.x>=1&&v.x<=n&&v.y>=1&&v.y<=m&&((v.x==ex&&v.y==ey)||world[v.x][v.y]==0))//这里(v.x==ex&&v.y==ey)不能改成与目标内容相同!!! { if(v.d1!=-1) { if(v.d1!=i) { v.chance++;v.d1=i; } } else v.d1=i; if(v.chance>2)continue; if(v.chance<=f[v.x][v.y]) { // printf("%d %d %d\n",v.x,v.y,v.chance); f[v.x][v.y]=v.chance; q.push(v); } } } } printf("NO\n"); } int main() { while(cin>>n>>m,(n+m)) { for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&world[i][j]); int Q;scanf("%d",&Q); for(int i=1;i<=Q;i++) { scanf("%d%d%d%d",&sx,&sy,&ex,&ey); if(world[sx][sy]!=world[ex][ey]||!world[sx][sy]||!world[ex][ey]||(ex==sx&&sy==ey)) printf("NO\n"); else bfs(); } } return 0; }
判断条件需谨慎QAQ
标签:set ++ gif name alt print cstring node cfa
原文地址:https://www.cnblogs.com/bxd123/p/10304600.html