题目链接:P1979
神奇的是我下载了一个数据后在本机上测试通过,但在洛谷测评器上 RE 了
代码:(虽然我不知道还有没有其他 WA 的问题,但我必须先解决 RE)
#include <bits/stdc++.h>
#define MAXN 32
#define MAXM 32
#define FAILED -1
#define DOWN 0
#define UP 1
#define RIGHT 2
#define LEFT 3
using namespace std;
const int dx[]= {1,-1,0,0};
const int dy[]= {0,0,1,-1};
const int inf=0x7f7f7f7f;
int a[MAXN][MAXM];
int dis[MAXN][MAXM]; // 在某个节点变为阻碍时节点 (x1,y1) 到 (x2,y2)的距离为 dis[x2][y2]
int hind[MAXN][MAXM][4][4]; // 节点 (x,y) 沿方向 v1 的第一个节点为变阻碍时在向 v2 方向到第二个节点的距离
int f[MAXN][MAXM][4];
int vis[MAXN][MAXM];
int n,m,q;
inline bool check(int x,int y,const int tag=-1) {
return x>=1&&x<=n&&y>=1&&y<=m&&vis[x][y]!=tag&&a[x][y]!=0;
}
void bfs(int x,int y,int d[MAXN][MAXM],const int tag) {
memset(d,-1,MAXN*MAXM*sizeof(int));
memset(vis,0,sizeof(vis));
static queue<int> Qx;
static queue<int> Qy;
Qx.push(x),Qy.push(y);
d[x][y]=0;
vis[x][y]=tag;
while(!Qx.empty()&&!Qy.empty()) {
int tx=Qx.front(),ty=Qy.front();
Qx.pop(),Qy.pop();
for(int i=0; i<4; i++)
if(check(tx+dx[i],ty+dy[i],tag)) {
Qx.push(tx+dx[i]);
Qy.push(ty+dy[i]);
vis[tx+dx[i]][ty+dy[i]]=tag;
d[tx+dx[i]][ty+dy[i]]=d[tx][ty]+1;
}
}
}
int bfs(int x,int y,int ox,int oy,const int tag) {
static queue<int> Qx;
static queue<int> Qy;
static int d[MAXN][MAXM];
memset(vis,0,sizeof(vis));
Qx.push(x),Qy.push(y);
d[x][y]=0;
vis[x][y]=tag;
while(!Qx.empty()&&!Qy.empty()) {
int tx=Qx.front(),ty=Qy.front();
Qx.pop(),Qy.pop();
for(int i=0; i<4; i++)
if(check(tx+dx[i],ty+dy[i],tag)) {
Qx.push(tx+dx[i]);
Qy.push(ty+dy[i]);
vis[tx+dx[i]][ty+dy[i]]=tag;
d[tx+dx[i]][ty+dy[i]]=d[tx][ty]+1;
if(tx+dx[i]==ox&&ty+dy[i]==oy)
return d[tx+dx[i]][ty+dy[i]];
}
}
return FAILED;
}
void dfs(int x,int y,int vl,int ox,int oy,int sum) {
if(sum==0)
return;
if(!check(x,y))
return;
if(~f[x][y][vl]&&sum>f[x][y][vl])
return;
f[x][y][vl]=sum;
if(x==ox&&y==oy)
return;
for(int vt=0;vt<4;vt++){
if(hind[x+dx[vl^1]][y+dy[vl^1]][vl][vt]==FAILED)
continue;
dfs(x+dx[vt],y+dy[vt],vt,ox,oy,sum+hind[x+dx[vl^1]][y+dy[vl^1]][vl][vt]+1);
}
return;
}
int solve(int Ex,int Ey,int Sx,int Sy,int Tx,int Ty) {
memset(f,-1,sizeof(f));
for(int v=0; v<4; v++)
f[Sx][Sy][v]=0;
for(int v=0; v<4; v++)
dfs(Sx+dx[v],Sy+dy[v],v,Tx,Ty,dis[Sx+dx[v]][Sy+dy[v]]+1);
bool failed=true;
int ans=inf;
for(int v=0;v<4;v++)
if(f[Tx][Ty][v]!=FAILED){
failed=false;
ans=min(ans,f[Tx][Ty][v]);
}
if(failed) return FAILED;
else return ans;
}
int main() {
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
int tag=3,p1x,p1y,p2x,p2y;
cin>>n>>m>>q;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
cin>>a[i][j];
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++){
if(!check(i,j))
continue;
for(int v1=0; v1<4; v1++)
for(int v2=0; v2<4; v2++) {
p1x=i+dx[v1],p1y=j+dy[v1];
p2x=p1x+dx[v2],p2y=p1y+dy[v2];
if(!check(p1x,p1y)||!check(p2x,p2y))
continue;
if((v1^v2)==1)
continue;
a[p1x][p1y]=0;
hind[i][j][v1][v2]=bfs(i,j,p2x,p2y,tag^=1);
a[p1x][p1y]=1;
}
}
for(int i=1; i<=q; i++) {
int Ex,Ey,Sx,Sy,Tx,Ty;
cin>>Ex>>Ey>>Sx>>Sy>>Tx>>Ty;
a[Sx][Sy]=0;
bfs(Ex,Ey,dis,tag^=1);
a[Sx][Sy]=1;
cout<<solve(Ex,Ey,Sx,Sy,Tx,Ty)<<endl;
}
cout.flush();
return 0;
}