与1728类似,但写出来后一直超时。。。
最后把数组改为1001(原来为1024),就AC了。。
#include"stdio.h" #include"string.h" #include"queue" using namespace std; int dir[4][2]={1,0,0,1,-1,0,0,-1}; int map[1001][1001]; int v[1001][1001]; int n,m,t,ex,ey,sx,sy; struct node { int x,y,step; }; bool judge(int x,int y) { if(x>=1&&x<=n&&y>=1&&y<=m&& (map[x][y]==0||(x==ex&&y==ey))) return 1; return 0; } void bfs() { memset(v,0,sizeof(v)); queue<node>Q; int i,xx,yy; node s,e; s.x=sx; s.y=sy; s.step=-1; v[s.x][s.y]=1; Q.push(s); while(!Q.empty()) { s=Q.front(); Q.pop(); for(i=0;i<4;i++) { xx=s.x+dir[i][0]; yy=s.y+dir[i][1]; while(judge(xx,yy)) { if(v[xx][yy]==0) { v[xx][yy]=1; e.x=xx; e.y=yy; e.step=s.step+1; Q.push(e); if(e.x==ex&&e.y==ey&&e.step<=2) { printf("YES\n"); return ; } } xx+=dir[i][0]; yy+=dir[i][1]; } } } printf("NO\n"); return ; } int main() { int i,j; while(scanf("%d%d",&n,&m),n+m) { for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d",&map[i][j]); scanf("%d",&t); while(t--) { scanf("%d%d%d%d",&sx,&sy,&ex,&ey); if((sx==ex&&sy==ey)||map[sx][sy]==0 ||map[ex][ey]==0||map[sx][sy]!=map[ex][ey]) printf("NO\n"); else bfs(); } } return 0; }