• POJ 3369 Meteor Shower (BFS,水题)


    题意:给定 n 个炸弹的坐标和爆炸时间,问你能不能逃出去。如果能输出最短时间。

    析:其实这个题并不难,只是当时没读懂,后来读懂后,很容易就AC了。

    主要思路是这样的,先标记所有的炸弹的位置,和时间,在数组中标记就好,只要赋值给它的爆炸时间就好,注意如果有多个,要赋值最小的那个,

    然后用BFS走就行了。

    代码如下:

    #include <cstdio>
    #include <string>
    #include <cstdlib>
    #include <cmath>
    #include <iostream>
    #include <cstring>
    #include <set>
    #include <queue>
    #include <algorithm>
    #include <vector>
    #include <map>
    using namespace std ;
    
    typedef long long LL;
    typedef pair<int, int> P;
    const int INF = 0x3f3f3f3f;
    const double inf = 0x3f3f3f3f3f3f3f;
    const double eps = 1e-8;
    const int maxn = 300 + 15;
    const int dr[] = {0, 0, -1, 1};
    const int dc[] = {-1, 1, 0, 0};
    int m, n;
    inline bool is_in(int r, int c){
        return r >= 0 && r < n && c >= 0 && c < m;
    }
    int s[maxn][maxn];
    int vis[maxn][maxn];
    struct node{
        int x, y, d;
        node(int xx, int yy, int dd) : x(xx), y(yy), d(dd) { }
    };
    
    int bfs(){
        queue<node> q;
        q.push(node(0, 0, 0));
        vis[0][0] = 1;
        if(!s[0][0])  return -1;
        while(!q.empty()){
            node u = q.front();  q.pop();
            for(int i = 0; i < 4; ++i){
                int x = u.x + dr[i];
                int y = u.y + dc[i];
                if(x < 0 || y < 0 || x > 305 || y > 305 || vis[x][y] || s[x][y] <= u.d+1)  continue;
                vis[x][y] = 1;
                if(s[x][y] == INF)  return u.d+1;
                q.push(node(x, y, u.d+1));
            }
        }
        return -1;
    }
    
    int main(){
        while(scanf("%d", &n) == 1){
            int x, y, t;
            for(int i = 0; i < 305; ++i)
                for(int j = 0; j < 305; ++j)
                    s[i][j] = INF;
            for(int i = 0; i < n; ++i){
                scanf("%d %d %d", &x, &y, &t);
                if(x > 0)  s[x-1][y] = min(t, s[x-1][y]);
                if(y > 0)  s[x][y-1] = min(t, s[x][y-1]);
                s[x+1][y] = min(t, s[x+1][y]);
                s[x][y+1] = min(t, s[x][y+1]);
                s[x][y] = min(t, s[x][y]);
            }
            memset(vis, 0, sizeof(vis));
            printf("%d
    ", bfs());
        }
        return 0;
    }
    
  • 相关阅读:
    Windows Form -----内容(3)
    Windows Form -----内容(2)
    Windows Form -----内容(1)
    C#与数据库链接---小练3--插入语句的验证
    C#与数据库链接---小练2--查询
    连接数据库--小练---简单增删改
    SQL简短汇总
    面向对象---4
    面向对象--3
    面向对象----类2
  • 原文地址:https://www.cnblogs.com/dwtfukgv/p/5754230.html
Copyright © 2020-2023  润新知