1 条题解

  • 0
    @ 2024-6-1 14:26:04

    预处理a[i][j]表示每个格子什么时候被烧毁,从(0,0)出发进行bfs,一旦搜索到一个永远不会被烧毁的地方,则说明找到安全位置,返回此时的时间

    #include<bits/stdc++.h>
    using namespace std;
    const int N=305;
    int n,m,k,s,t,a[N][N],d[N][N],dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
    queue<pair<int,int>> q;
    int bfs(){
    	memset(d,0x3f,sizeof(d));
    	d[0][0]=0;
    	q.push({0,0});
    	while (!q.empty()){
    		int x=q.front().first;
    		int y=q.front().second;
    		q.pop();
    		if (a[x][y]==0x3f3f3f3f) return d[x][y];
    		for (int i=0;i<4;++i){
    			int _x=x+dx[i];
    			int _y=y+dy[i];
    			if (_x>=0 && _y>=0 && d[_x][_y]>d[x][y]+1 && d[x][y]+1<a[_x][_y]) {
    				d[_x][_y]=d[x][y]+1;
    				q.push({_x,_y});
    			}
    		}			
    	}
    	return -1;
    }
    int main(){
    	cin>>n;int x,y;
    	memset(a,0x3f,sizeof(a));
    	for (int i=1;i<=n;++i){
    		cin>>x>>y>>t;
    		a[x][y]=min(a[x][y],t);
    		a[x+1][y]=min(a[x+1][y],t);
    		a[x][y+1]=min(a[x][y+1],t);
    		if (y>0) a[x][y-1]=min(a[x][y-1],t);
    		if (x>0) a[x-1][y]=min(a[x-1][y],t);
    	}	
    	cout<<bfs();
    }
    
    • 1

    [USACO08FEB] Meteor Shower S【中等】

    信息

    ID
    766
    时间
    1000ms
    内存
    125MiB
    难度
    6
    标签
    递交数
    136
    已通过
    44
    上传者