谁看得懂?
  • 板块学术版
  • 楼主czk111
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/4/5 16:31
  • 上次更新2023/10/28 04:32:04
查看原帖
谁看得懂?
682044
czk111楼主2022/4/5 16:31
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=105,flag[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
int n,m,dis[maxn][maxn][4],sx,sy,tx,ty,fx,v,ans;
struct data{ int x,y,fx; } que[1000005];
char map[maxn][maxn];
bool vis[maxn][maxn][4];

bool check(int x,int y){
	return x>0&&x<=n&&y>0&&y<=m&&map[x][y]!='.';
}
int getw(int x,int y){
	if(x-y==1||x-y==-3) return 35;
	if(x-y==-1||x-y==3) return 40;
	if(x==y) return 0;
}
int max4(int a,int b,int c,int d){
	a=max(a,b);
	a=max(a,c);
	return a=max(a,d);
}
int main(){
	freopen("flying.in","r",stdin);freopen("flying.out","w",stdout);
	scanf("%d%d%d\n",&n,&m,&v);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			map[i][j]=getchar();
			if(map[i][j]=='N') sx=i, sy=j, fx=0;//标记起点及方向 
			if(map[i][j]=='S') sx=i, sy=j, fx=2;
			if(map[i][j]=='E') sx=i, sy=j, fx=1;
			if(map[i][j]=='W') sx=i, sy=j, fx=3;
			if(map[i][j]=='F') tx=i, ty=j;//标记终点 
		}
		getchar();
	}
	memset(dis,192,sizeof(dis)); int INF=dis[0][0][0];//dis[x][y][i]表示从i方向进入x,y点的最大速度 
	int head=0,tail=1;
	que[1]=(data){sx,sy,fx};
	dis[sx][sy][fx]=v;//初始速度 
	while(head<tail){
		int x=que[++head].x,y=que[head].y,f=que[head].fx;
		vis[x][y][f]=false;
		bool pd=true; 
		for(int i=0;i<=3;i++)if(abs(i-f)!=2){//不是调头,可以选择直走或左拐或右拐时 
			int xx=x+flag[i][0],yy=y+flag[i][1];
			if(check(xx,yy)){
				pd=false;
				if(max(0,dis[x][y][f]-getw(f,i))+1>dis[xx][yy][i]){//转弯速度最小速度为0,当前速度减去转弯速度与0的最大值 
					dis[xx][yy][i]=max(0,dis[x][y][f]-getw(f,i))+1;
					if(!vis[xx][yy][i]) vis[xx][yy][i]=true, que[++tail]=(data){xx,yy,i};
				}
			}	
		}
		if(pd)//无路可走时只能掉头 
		for(int i=0;i<=3;i++)if(abs(i-f)==2){
			int xx=x+flag[i][0],yy=y+flag[i][1];
			if(check(xx,yy)){
				if(1>dis[xx][yy][i]){
					dis[xx][yy][i]=1;
					if(!vis[xx][yy][i]) vis[xx][yy][i]=true, que[++tail]=(data){xx,yy,i};
				}
			}	
		}	
	}
	ans=max4(dis[tx][ty][0],dis[tx][ty][1],dis[tx][ty][2],dis[tx][ty][3]);
	printf("%d",ans==INF?0:ans);	
	return 0;
}
2022/4/5 16:31
加载中...