样例能过但测试点全WA!大佬求助
查看原帖
样例能过但测试点全WA!大佬求助
775277
xiongzecheng楼主2023/10/14 18:26
#include<bits/stdc++.h>
using namespace std;
int dis[1005][1005],n,m,h;
int beforex[1005][1005],beforey[1005][1005],_goto[1005][1005];
void bfs(){
	queue<int>qx,qy;
	qx.push(0),qy.push(0);
	dis[0][0]=0;
	while(!qx.empty()){
		int x=qx.front(),y=qy.front();
		qx.pop(),qy.pop();
		if(x!=n&&dis[n][y]==-1){
			dis[n][y]=dis[x][y]+1;
			qx.push(n),qy.push(y);
			beforex[n][y]=x,beforey[n][y]=y,_goto[n][y]=1;
		}
		if(y!=m&&dis[x][m]==-1){
			dis[x][m]=dis[x][y]+1;
			qx.push(x),qy.push(m);
			beforex[x][m]=x,beforey[x][m]=y,_goto[x][m]=2;
		}
		if(x!=0&&dis[0][y]==-1){
			dis[0][y]=dis[x][y]+1;
			qx.push(0),qy.push(y);
			beforex[0][y]=x,beforey[0][y]=y,_goto[0][y]=3;
		}
		if(y!=0&&dis[x][0]==-1){
			dis[x][0]=dis[x][y]+1;
			qx.push(x),qy.push(0);
			beforex[x][0]=x,beforey[x][0]=y,_goto[x][0]=4;
		}
		if(x!=0&&y!=m){
			int dl=min(x,m-y);
			int nx=x-dl,ny=y+dl;
			if(dis[nx][ny]==-1){
				dis[nx][ny]=dis[x][y]+1;
				qx.push(nx),qy.push(ny);
				beforex[nx][ny]=x,beforey[nx][ny]=y,_goto[nx][ny]=6;
			}
		}
		if(y!=0&&x!=n){
			int dl=min(y,n-x);
			int nx=x+dl,ny=y-dl;
			if(dis[nx][ny]==-1){
				dis[nx][ny]=dis[x][y]+1;
				qx.push(nx),qy.push(ny);
				beforex[nx][ny]=x,beforey[nx][ny]=y,_goto[nx][ny]=5;
			}
		}
	}
}
int main(){
	ios::sync_with_stdio(false);
	int T;
	cin>>T;
	while(T--){
		cin>>n>>m>>h;
		memset(dis,-1,sizeof(dis));
		memset(beforex,0,sizeof(beforex));
		memset(beforey,0,sizeof(beforey));
		memset(_goto,0,sizeof(_goto));
		bfs();
		int minn=INT_MAX,x,y;
		for(int i=0;i<=n;i++)
			if(dis[i][h]!=-1)
				if(minn>dis[i][h]&&_goto[i][h]){
					minn=dis[i][h];
					x=i,y=h;
				}
		printf("%d ",minn);
		vector<int>vec;
		while(x!=0||y!=0){
			vec.push_back(_goto[x][y]);
			int lj=beforex[x][y],lz=beforey[x][y];
			x=lj,y=lz;
		}
		for(int i=vec.size()-1;i>=0;i--)cout<<vec[i]<<" ";
		cout<<"\n";
	}
	return 0;
}
2023/10/14 18:26
加载中...