poj3669

好日狗,这道题首先用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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值