救命,开O2就AC,不开就RE
  • 板块灌水区
  • 楼主我是歌者
  • 当前回复7
  • 已保存回复7
  • 发布时间2023/7/31 08:21
  • 上次更新2023/11/3 06:49:24
查看原帖
救命,开O2就AC,不开就RE
566190
我是歌者楼主2023/7/31 08:21

题目描述 一场流星雨即将攻击地球,数量有限,共有M个陨石。若将地球看成一个N*N的方阵,陨石击中某个点时,会让该点及其上下左右四个点变成火海。有一个人站在点(1,1)处,每一分钟可以移动一步到相邻的上下左右四个格子,他不想被火海吞没,想要到达(N,N)的安全屋躲过灾难。请问他最短的逃命时间为多少,如果无论怎样都到达不了安全屋,则输出-1。

(注:安全屋被攻击不会变成火海。)

输入格式 第一行包含两个整数,分别为N和M。

第二至M+1行,每行包含三个整数X、Y、T,代表点(X,Y)将在第T分钟被陨石击中。

输出格式 仅包含一个整数,代表最短的逃命时间,如果无论怎样都到不了安全屋,则输出-1。

#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
int mapp[3010][3010],n,m,vis[3010][3010],ans;//mapp[i][j]存如果有陨石那么存时间,如果没有存极大值
int xt[4]={0,0,1,-1};
int yt[4]={1,-1,0,0}; 
struct node{
	int x;
	int y;
	int step;
};
int bfs(int x,int y,int s){
	queue<node> q;
	node a;
	a.x=x;
	a.y=y;
	a.step=s;
	q.push(a);
	while(!q.empty()){
		int nx=q.front().x;
		int ny=q.front().y;
		int ns=q.front().step;
		q.pop();
		if(nx==n && ny==n){
			return ns;
		}
		ns++;
		for(int i=0;i<4;i++){
			int tx=nx+xt[i];
			int ty=ny+yt[i];
			if(tx<1||tx>n||ty<1||ty>n||vis[tx][ty]!=0||mapp[tx][ty]<=ns){
				continue;
			}
			vis[tx][ty]=1;
			node b;
			b.x=tx;
			b.y=ty;
			b.step=ns;
			q.push(b);
		}
	}
	return -1;
}
int main(){
     freopen("meteor.in","r",stdin);
     freopen("meteor.out","w",stdout);
	 cin>>n>>m;
	 
	 for(int i=1;i<=n;i++){
	 	for(int j=1;j<=n;j++){
	 		mapp[i][j]=1000000;
	 		vis[i][j]=0;
		 }
	 }
	int x;
	int y;
	int t;
	
	 for(int i=1;i<=m;i++){
	 	cin>>x>>y>>t;
         if(x!=n&&y!=n) mapp[x][y]=min(mapp[x][y],t);
         for(int j=0;j<4;j++){
         	if(x+xt[j]==n&&y+yt[j]==n){
            	continue;
            }
             else{
                 mapp[x+xt[j]][y+yt[j]]=min(mapp[x+xt[j]][y+yt[j]],t);
             }
         }
	 	
	 }
	 vis[1][1]=1;
	 cout<<bfs(1,1,0);
     fclose(stdin);
    fclose(stdout);
	 return 0;
}

U283553

2023/7/31 08:21
加载中...