题目U283553 我的代码不开O2就RE,开了只过一个点
#include<bits/stdc++.h>
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(){
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;
mapp[x][y]=t;
mapp[x+1][y]=t;
mapp[x-1][y]=t;
mapp[x][y-1]=t;
mapp[x][y+1]=t;
}
vis[1][1]=1;
cout<<bfs(1,1,0);
return 0;
}