Run ID 作者 问题 语言 测评结果 时间 内存 代码长度 提交时间
91299 sh25_shenpy 华容道(Day 2) C++ 运行超时 1000 MS 1732 KB 2295 2026-06-12 15:28:37

Tests(0/20):


#include<cstdio> #include<algorithm> #include<vector> #include<cstring> #include<queue> #include<map> #include<iostream> #include<cmath> using namespace std; #define ll long long #define INF 0x3f3f3f3f #define N 35 int rd() { int f=1,s=0;char c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();} while(c>='0'&&c<='9'){s=(s<<3)+(s<<1)+(c^48);c=getchar();} return f*s; } struct node{ int mx,my,nx,ny;//空格的位置,初始棋子现在的位置 int stp;//步数 }; int n,m,q; int mp[N][N]; int ex,ey,sx,sy,tx,ty; queue<node>Q; const int dx[]={1,-1,0,0},dy[]={0,0,1,-1}; bool vis[N][N][N][N]; bool check(int xx,int yy) { if(xx<0||xx>n||yy<0||yy>m||mp[xx][yy]==0) return 0; return 1; } int main() { n=rd(),m=rd(),q=rd(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) mp[i][j]=rd(); while(q--) { ex=rd(),ey=rd(),sx=rd(),sy=rd(),tx=rd(),ty=rd(); if(sx==tx&&sy==ty) {//下面村答案是在拓展节点之后存 所以这里要特判 puts("0");//如果取出时存答案就不用特判(好像也不用break很多层了 continue; } memset(vis,0,sizeof(vis)); bool flag=0; while(!Q.empty()) Q.pop(); node s;s.mx=ex,s.my=ey,s.nx=sx,s.ny=sy,s.stp=0; vis[ex][ey][sx][sy]=1; Q.push(s); while(!Q.empty()) { s=Q.front();Q.pop(); for(int i=0;i<4;i++) { node nxt; nxt.mx=s.mx+dx[i],nxt.my=s.my+dy[i]; if(!check(nxt.mx,nxt.my)) continue; if(nxt.mx==s.nx&&nxt.my==s.ny) nxt.nx=s.mx,nxt.ny=s.my; else nxt.nx=s.nx,nxt.ny=s.ny; nxt.stp=s.stp+1; if(nxt.nx==tx&&nxt.ny==ty) { flag=1; printf("%d\n",nxt.stp); break; } if(vis[nxt.mx][nxt.my][nxt.nx][nxt.ny]) continue; Q.push(nxt); vis[nxt.mx][nxt.my][nxt.nx][nxt.ny]=1; } if(flag) break; } if(flag) continue; else puts("-1"); } return 0; }


测评信息: