求助 P1979 [NOIP2013 提高组] 华容道 所有测试点 RE
  • 板块学术版
  • 楼主meizhuhe
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/7/23 14:09
  • 上次更新2023/11/4 13:34:43
查看原帖
求助 P1979 [NOIP2013 提高组] 华容道 所有测试点 RE
482921
meizhuhe楼主2021/7/23 14:09

题目链接: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;
}
2021/7/23 14:09
加载中...