zoukankan      html  css  js  c++  java
  • csuoj 你经历过绝望吗?两次! bfs + 优先队列

    Description

    4月16日,日本熊本地区强震后,受灾严重的阿苏市一养猪场倒塌,幸运的是,猪圈里很多头猪依然坚强存活。当地15名消防员耗时一天解救围困的“猪坚强”。不过与在废墟中靠吃木炭饮雨水存活36天的中国汶川“猪坚强”相比,熊本的猪可没那么幸运,因为它们最终还是没能逃过被送往屠宰场的命运。
    我们假设“猪坚强”被困在一个N*M的废墟中,其中“@”表示“猪坚强”的位置,“.”表示可以直接通过的空地,“#”表示不能拆毁的障碍物,“*”表示可以拆毁的障碍物,那么请问消防员至少要拆毁多少个障碍物,才能从废墟中救出“猪坚强”送往屠宰场?(当“猪坚强”通过空地或被拆毁的障碍物移动到废墟边缘时,视作被救出废墟)

    Input

    多组数据,第一行有一个整数T,表示有T组数据。(T<=100)
    以下每组数据第一行有两个整数N和M。(1<=N,M<=100)
    接着N行,每行有一个长度为M的字符串。

    Output

    一个整数,为最少拆毁的障碍物数量,如果不能逃离废墟,输出-1。

    Sample Input

    3
    3 3
    ###
    #@*
    ***
    3 4
    ####
    #@.*
    **.*
    3 3
    .#.
    #@#
    .#.

    Sample Output

    1
    0
    -1

    代码:

    #include<iostream>
    #include<queue>
    using namespace std;
    struct Node{
        int x;
        int y;
        int z;
    };
    
    struct cmp{
        bool operator()(Node a,Node b){
            return a.z > b.z;
        }
    };
    
    char ch[100][101];
    
    int main(){
        int t;
        cin  >> t;
        while(t--){
            int n,m;
            cin >> n >> m;
            for(int i = 0;i < n;i++) cin >> ch[i];
            int a,b;
            a = -1;
            for(int i = 0;i < n;i++){
                for(int j = 0;j < m;j++){
                    if(ch[i][j] == '@'){
                        a = i;
                        b = j;
                        break;
                    }
                }
                if(a != - 1) break;
            }
            priority_queue<Node,vector<Node>,cmp> q;
            int ans = -1;
            struct Node *node = new struct Node;
            node->x = a;
            node->y = b;
            node->z = 0;
            q.push(*node);
            ch[node->x][node->y] = '#';
            bool flag = false;
            while(!q.empty()){
                struct Node *now = new struct Node;
                *now = q.top();
                q.pop();
    //            cout << "now " << now->x << "  " << now->y << "  " << now->z << endl;
                if(now->x == 0 || now->x == n - 1 || now->y == 0 || now->y == m - 1){
                    ans = now->z;
                    break;
                }
                else{
                    if(now->y - 1 >= 0){
                        if(ch[now->x][now->y - 1] == '.'){
                            struct Node *temp = new struct Node;
                            temp->x = now->x;
                            temp->y = now->y - 1;
                            temp->z = now->z;
                            q.push(*temp);
    //                        cout << "push " << temp->x << "  " << temp->y << "  " << temp->z << endl;
                            ch[now->x][now->y - 1] = '#';
                        }
                        else if(ch[now->x][now->y - 1] == '*'){
                            struct Node *temp = new struct Node;
                            temp->x = now->x;
                            temp->y = now->y - 1;
                            temp->z = now->z + 1;
                            q.push(*temp);
    //                        cout << "push " << temp->x << "  " << temp->y << "  " << temp->z << endl;
                            ch[now->x][now->y - 1] = '#';
                        }
                    }
                    if(now->y + 1 <= m - 1){
                        if(ch[now->x][now->y + 1] == '.'){
                            struct Node *temp = new struct Node;
                            temp->x = now->x;
                            temp->y = now->y + 1;
                            temp->z = now->z;
                            q.push(*temp);
    //                        cout << "push " << temp->x << "  " << temp->y << "  " << temp->z << endl;
                            ch[now->x][now->y + 1] = '#';
                        }
                        else if(ch[now->x][now->y + 1] == '*'){
                            struct Node *temp = new struct Node;
                            temp->x = now->x;
                            temp->y = now->y + 1;
                            temp->z = now->z + 1;
                            q.push(*temp);
    //                        cout << "push " << temp->x << "  " << temp->y << "  " << temp->z << endl;
                            ch[now->x][now->y + 1] = '#';
                        }
                    }
                    if(now->x - 1 >= 0){
                        if(ch[now->x - 1][now->y] == '.'){
                            struct Node *temp = new struct Node;
                            temp->x = now->x - 1;
                            temp->y = now->y;
                            temp->z = now->z;
                            q.push(*temp);
    //                        cout << "push " << temp->x << "  " << temp->y << "  " << temp->z << endl;
                            ch[now->x - 1][now->y] = '#';
                        }
                        else if(ch[now->x - 1][now->y] == '*'){
                            struct Node *temp = new struct Node;
                            temp->x = now->x - 1;
                            temp->y = now->y;
                            temp->z = now->z + 1;
                            q.push(*temp);
    //                        cout << "push " << temp->x << "  " << temp->y << "  " << temp->z << endl;
                            ch[now->x - 1][now->y] = '#';
                        }
                    }
                    if(now->x + 1 <= n - 1){
                        if(ch[now->x + 1][now->y] == '.'){
                            struct Node *temp = new struct Node;
                            temp->x = now->x + 1;
                            temp->y = now->y;
                            temp->z = now->z;
                            q.push(*temp);
    //                        cout << "push " << temp->x << "  " << temp->y << "  " << temp->z << endl;
                            ch[now->x + 1][now->y] = '#';
                        }
                        else if(ch[now->x + 1][now->y] == '*'){
                            struct Node *temp = new struct Node;
                            temp->x = now->x + 1;
                            temp->y = now->y;
                            temp->z = now->z + 1;
                            q.push(*temp);
    //                        cout << "push " << temp->x << "  " << temp->y << "  " << temp->z << endl;
                            ch[now->x + 1][now->y] = '#';
                        }
                    }
                }
            }
            cout << ans << endl;
        }
        return 0;
    }
  • 相关阅读:
    107. Binary Tree Level Order Traversal II
    103. Binary Tree Zigzag Level Order Traversal
    102. Binary Tree Level Order Traversal
    690. Employee Importance
    1723. Find Minimum Time to Finish All Jobs
    LeetCode 329 矩阵中最长增长路径
    7.2 物理内存管理
    LeetCode 面试题 特定深度节点链表
    LeetCode 100 相同的树
    npm安装包命令详解,dependencies与devDependencies实际区别
  • 原文地址:https://www.cnblogs.com/tracy520/p/6974760.html
Copyright © 2011-2022 走看看