本地测试没问题,一交上去评测机读出来的与本地数据就不一样了。。。
查看原帖
本地测试没问题,一交上去评测机读出来的与本地数据就不一样了。。。
366595
zty_luogu楼主2021/5/27 23:16

求助QWQ

#include<bits/stdc++.h>//本题牵涉到格与点但只不过要多判断x,y x+1,y x,y+1 x+1,y+1这几个即可
using namespace std;
int dx[4]={0,1,0,-1},
	dy[4]={1,0,-1,0};
#define F(iii,aaa,bbb) for(int iii=aaa;iii<=bbb;iii++)//避免变量重复
int main()
{
	int vis[60][60]={},m,n,mp[60][60],bfs[3600]={};
	int k,x[3600]={},y[3600]={},toward[3600]={};//towand当前朝向
	cin>>m>>n;
	int bx,by,ex,ey;
	F(i,1,m)
		F(j,1,n){
			cin>>mp[i][j];
		}
	char c;
	cin>>bx>>by>>ex>>ey>>c;//东E,南S,西W,北N;
	int s;
	if(c=='E') s=0; if(c=='S') s=1; if(c=='W') s=2; if(c=='N') s=3;
	x[1]=bx;
	y[1]=by;
	toward[1]=s;//toward作为偏移量的下标
	bfs[1]=0;
    vis[bx][by]=1;
    int l=0,r=1;
    int ans=0;
	while(l<r){
		l++;
		int xx,yy;
		xx=x[l]+dx[toward[l]];
		yy=y[l]+dy[toward[l]];
		if(!vis[xx][yy]&&xx>=1&&xx<=m&&yy>=1&&yy<=n&&
		!mp[xx][yy]&&!mp[xx+1][yy]&&!mp[xx][yy+1]&&!mp[xx+1][yy+1]){//x,y x+1,y x,y+1 x+1,y+1
			r++;
			bfs[r]=bfs[l]+1;
			x[r]=xx;
			y[r]=yy;
			toward[r]=toward[l];
			vis[xx][yy]=1;
		}
		else
		    if(!vis[xx][yy])
				goto out;

		if(vis[ex][ey])
		{
			cout<<bfs[r];
			return 0;
		}
		
		xx=x[l]+2*dx[toward[l]];
		yy=y[l]+2*dy[toward[l]];
		if(!vis[xx][yy]&&xx>=1&&xx<=m&&yy>=1&&yy<=n&&
		!mp[xx][yy]&&!mp[xx+1][yy]&&!mp[xx][yy+1]&&!mp[xx+1][yy+1]){//x,y x+1,y x,y+1 x+1,y+1
			r++;
			bfs[r]=bfs[l]+1;
			x[r]=xx;
			y[r]=yy;
			toward[r]=toward[l];
			vis[xx][yy]=1;
		}
		else
		    if(!vis[xx][yy])
				goto out;

		if(vis[ex][ey])
		{
			cout<<bfs[r];
			return 0;
		}

		xx=x[l]+3*dx[toward[l]];
		yy=y[l]+3*dy[toward[l]];
		if(!vis[xx][yy]&&xx>=1&&xx<=m&&yy>=1&&yy<=n&&
		!mp[xx][yy]&&!mp[xx+1][yy]&&!mp[xx][yy+1]&&!mp[xx+1][yy+1]){//x,y x+1,y x,y+1 x+1,y+1
			r++;
			bfs[r]=bfs[l]+1;
			x[r]=xx;
			y[r]=yy;
			toward[r]=toward[l];
			vis[xx][yy]=1;
		}
		else
		    if(!vis[xx][yy])
				goto out;

		if(vis[ex][ey])
		{
			cout<<bfs[r];
			return 0;
		}

		out:;//若第一个不满足且不是已经访问则后2个不可能可以走
		
		if(toward[l]+1<=3){
			r++;
			bfs[r]=bfs[l]+1;
			x[r]=x[l];
			y[r]=y[l];
			toward[r]=toward[l]+1;
		}
		
		if(toward[l]-1>=0){
			r++;
			bfs[r]=bfs[l]+1;
			x[r]=x[l];
			y[r]=y[l];
			toward[r]=toward[l]-1;
		}
	}
	cout<<-1;
	return 0;
}

2021/5/27 23:16
加载中...