IYSY2009I @ 2023-08-04 21:53:44
下面给出我的代码,带注释的行就是上面提到的需要注意的点,把所有注释取消掉交上就能满分。
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int mp[305][305];
bool vis[305][305];
int cnt;
int x[400005];
int y[400005];
int t[400005];
queue<pair<int,int> > q;
int main(){
int m;
scanf("%d",&m);
// t[0]=1e9;
x[0]=304,y[0]=304;
// for(int i=1;i<=4*m;i++)
// t[i]=1e9;
for(int i=1;i<=m;i++){
cnt++;
scanf("%d%d%d",&x[cnt],&y[cnt],&t[cnt]);
// if(t[mp[x[cnt]][y[cnt]]]>t[cnt]) mp[x[cnt]][y[cnt]]=cnt;
int id=cnt;
if(x[cnt]>0){
cnt++;
x[cnt]=x[id]-1;
y[cnt]=y[id];
t[cnt]=t[id];
// if(t[mp[x[cnt]][y[cnt]]]>t[cnt]) mp[x[cnt]][y[cnt]]=cnt;
}
if(y[cnt]>0){
cnt++;
x[cnt]=x[id];
y[cnt]=y[id]-1;
t[cnt]=t[id];
// if(t[mp[x[cnt]][y[cnt]]]>t[cnt]) mp[x[cnt]][y[cnt]]=cnt;
}
cnt++;
x[cnt]=x[id]+1;
y[cnt]=y[id];
t[cnt]=t[id];
// if(t[mp[x[cnt]][y[cnt]]]>t[cnt]) mp[x[cnt]][y[cnt]]=cnt;
cnt++;
x[cnt]=x[id];
y[cnt]=y[id]+1;
t[cnt]=t[id];
// if(t[mp[x[cnt]][y[cnt]]]>t[cnt]) mp[x[cnt]][y[cnt]]=cnt;
}
if(!mp[0][0]){
printf("0");
return 0;
}
if(!t[mp[0][0]]||!t[mp[0][1]]||!t[mp[1][0]]){
printf("-1");
return 0;
}
q.push(make_pair(mp[0][0],0));
while(!q.empty()){
pair<int,int> p=q.front();
q.pop();
if(vis[x[p.first]][y[p.first]]) continue;
vis[x[p.first]][y[p.first]]=1;
if(!mp[x[p.first]][y[p.first]]){
printf("%d",p.second);
return 0;
}
if(x[p.first]>0&&t[mp[x[p.first]-1][y[p.first]]]>p.second+1) q.push(make_pair(mp[x[p.first]-1][y[p.first]],p.second+1));
if(t[mp[x[p.first]+1][y[p.first]]]>p.second+1) q.push(make_pair(mp[x[p.first]+1][y[p.first]],p.second+1));
if(y[p.first]>0&&t[mp[x[p.first]][y[p.first]-1]]>p.second+1) q.push(make_pair(mp[x[p.first]][y[p.first]-1],p.second+1));
if(t[mp[x[p.first]][y[p.first]+1]]>p.second+1) q.push(make_pair(mp[x[p.first]][y[p.first]+1],p.second+1));
}
printf("-1");
return 0;
}
by syk123 @ 2023-10-02 11:31:11
谢谢兄弟了