acmwriter @ 2023-06-01 23:50:09
#include<bits/stdc++.h>
using namespace std;
int dx[5]={0,0,0,1,-1};
int dy[5]={0,1,-1,0,0};
int a[305][305],b[305][305];
struct node{
int x,y,sum;
};
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
int c,d,t;
cin>>c>>d>>t;
for(int j=0;j<5;j++){
if(c+dx[j]>=0&&c+dx[j]<=300&&d+dy[j]>=0&&d+dy[j]<=300){
a[c+dx[j]][d+dy[j]]=t;
}
}
}
queue<node>q;
node F={0,0,0};
b[0][0]=1;
q.push(F);
while(!q.empty()){
node N=q.front();
q.pop();
if(a[N.x][N.y]==0){
cout<<N.sum;
return 0;
}
for(int i=1;i<5;i++){
int sx=N.x+dx[i];
int sy=N.y+dy[i];
if(sx>=0&&sx<=300&&sy>=0&&sy<=300&&!b[sx][sy]){
if(N.sum+1<a[sx][sy]){
node E={sx,sy,N.sum+1};
b[sx][sy]=1;
q.push(E);
}
if(a[sx][sy]==0){
cout<<N.sum+1;
return 0;
}
}
}
}
cout<<-1;
return 0;
}
by ricky_lin @ 2023-06-02 07:28:39
@acmwriter
有没有可能,有两个陨石会影响同一个地方的情况,让同一个地方被烧焦两次
还有一个地方就是,可能就是走出安全区要走出牧场
当然下面这个代码只是能过,走出左边界和上边界的因为越界,需要进行处理,可能会影响代码理解性我太懒了,也算是留一点给你自己写(方法就是整体向右下方移动几格。
int main(){
int n;
cin>>n;
memset(a,0x3f,sizeof(a));//change 1
for(int i=0;i<n;i++){
int c,d,t;
cin>>c>>d>>t;
for(int j=0;j<5;j++){
if(c+dx[j]>=0&&c+dx[j]<=302&&d+dy[j]>=0&&d+dy[j]<=302){
a[c+dx[j]][d+dy[j]]=min(t,a[c+dx[j]][d+dy[j]]);//取最小的被烧焦的时间 change2
}
}
}
queue<node>q;
node F={0,0,0};
b[0][0]=1;
q.push(F);
while(!q.empty()){
node N=q.front();
q.pop();
if(a[N.x][N.y]==0x3f3f3f3f){//对应改一下 change3
cout<<N.sum;
return 0;
}
for(int i=1;i<5;i++){
int sx=N.x+dx[i];
int sy=N.y+dy[i];
if(sx>=0&&sx<=302&&sy>=0&&sy<=302&&!b[sx][sy]){//跑出牧场 change4
if(N.sum+1<a[sx][sy]){
node E={sx,sy,N.sum+1};
b[sx][sy]=1;
q.push(E);
}
if(a[sx][sy]==0x3f3f3f3f){//change 5
cout<<N.sum+1;
return 0;
}
}
}
}
cout<<-1;
return 0;
}
by acmwriter @ 2023-06-02 23:46:53
@ricky_lin 感谢大佬,已过