好日狗,这道题首先用queue超时,修改了读取数据的方式,以及将queue变成了两个全局数组。TLE的问题解决了。
在调用solve()的时候总是会崩溃,不明所以,后来发现是特判情况没有很清晰的控制,比如说在0位置如果一开始就被炸了以及最开始就是安全的。
另外,最后总是WA,发现是因为。。手抖。。already[newx][newy]=1
写成了already[newy][newy]=1
还非常不好检查。。。
另外,注意:
- 同一个点可能有不同的流星砸到,取min。
- 启示位置特判
- 数组适当增大,因为题目中说是流星是0-300,没说人
测试数据:
23
2 5 10
1 3 5
5 3 12
3 3 9
1 8 7
8 4 15
2 3 7
0 0 2
6 7 10
4 4 10
3 7 7
8 5 13
0 4 9
2 6 8
0 2 4
6 4 12
0 6 7
4 2 10
1 4 7
4 6 10
5 5 12
6 5 14
2 1 2
#include <iostream>
#include <queue>
#include <string.h>
#define INF 0x3f3f3f3f
#define N 512
using namespace std;
int mat[N][N];
bool already[N][N];
typedef pair<int,int> P;
//queue<P> pos;
int qx[N*N];
int qy[N*N];
int head = 0,last = 0;
queue<int> _time;
int mintime = INF;
int dx[4] = {-1,1,0,0};
int dy[4] = {0,0,-1,1};
void solve(){
//while(pos.size()){
while(head<last){
//P p = pos.front();
int curx = qx[head];
int cury = qy[head++];
int t = _time.front();
_time.pop();
//pos.pop();
//cout<<curx<<' '<<cury<<' '<<t<<endl;
for(int i=0;i<4;i++){
//int newx = p.first+dx[i];
//int newy = p.second+dy[i];
int newx = curx + dx[i];
int newy = cury + dy[i];
if(newx<0 || newy <0 || newx >=N || newy >=N || already[newx][newy]==true )continue;
if(mat[newx][newy]==INF){
mintime = t+1;
return;
}
if(mat[newx][newy]>t+1){
//pos.push(P(newx,newy));
qx[last] = newx;
qy[last++] = newy;
already[newx][newy]=1;
_time.push(t+1);
}
}
}
return;
}
int main(int argc, const char * argv[]) {
int i,j,t,row,col,M;
cin>>M;
memset(mat,0x3f,sizeof(mat));
memset(already,0,sizeof(already));
for(i=0;i<M;i++){
scanf("%d%d%d",&row,&col,&t);
if(mat[row][col]==INF || t<mat[row][col])mat[row][col]=t;
if((row-1)>=0)mat[row-1][col] = min(t,mat[row-1][col]);
if((row+1)<N)mat[row+1][col] = min(t,mat[row+1][col]);
if((col-1>=0))mat[row][col-1] = min(t,mat[row][col-1]);
if((col+1)<N)mat[row][col+1] = min(t,mat[row][col+1]);
}
/*for(i=0;i<10;i++){
for(j=0;j<10;j++){
cout.width(10);
cout<<mat[i][j]<<' ';
}
cout<<endl;
}*/
if(mat[0][0]==0){
cout<<-1<<endl;
}else if(mat[0][0]==INF){
cout<<0<<endl;
}else{
already[0][0]=1;
//pos.push(pair<int,int>(0,0));
qx[last] = 0;
qy[last++] = 0;
_time.push(0);
solve();
if(mintime==INF)mintime = -1;
cout<<mintime<<endl;
}
return 0;
}