您的位置:首页 > 其它

poj3669

2016-07-03 13:43 274 查看
好日狗,这道题首先用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

;
bool already

;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj