• 挑战程序设计竞赛 2.1章习题 Aizu


    地址 https://vjudge.net/problem/Aizu-0558

    题意大意是 给予一个矩阵,S是起点   .是可以通过的通道  X是不可通过区域, 数字表示各种硬度的强度,
    
    如果小老鼠按照硬度的次序吃下这些奶酪,请问最小要走多少步(上下左右移动一次算一步,可经过奶酪但是不吃)
    
    输入格式为
    
    第一行 三个数字 H,W,N  H代表矩阵的高度 W代表矩阵的宽度 N代表各个奶酪的硬度范围
    
    H,W,N (1 ≤ H ≤ 10001 ≤ W ≤ 10001 ≤ N ≤ 9) 
    
    然后输入包含SX.和数字的矩阵
    
    输入格式为
    
    一行 输出吃完奶酪的最小步骤
    
    入力例 1
    3 3 1
    S..
    ...
    ..1
    出力例 1
    4
    入力例 2
    4 5 2
    .X..1
    ....X
    .XX.S
    .2.X.
    出力例 2
    12
    入力例 3
    10 10 9
    .X...X.S.X
    6..5X..X1X
    ...XXXX..X
    X..9X...X.
    8.X2X..X3X
    ...XX.X4..
    XX....7X..
    X..X..XX..
    X...X.XX..
    ..X.......
    出力例 3
    91

    题解 

    使用bfs求得最小步数

    只是每次的BFS起点和终点是不同的

    第一次是起终点是开始的位置和硬度为1的奶酪坐标。

    然后的起终点是硬度为1 的奶酪和硬度为2的奶酪坐标

    // 1123555.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
    //
    
    #include <iostream>
    #include <vector>
    #include <memory.h>
    #include <queue>
    
    
    
    
    using namespace std;
    
    
    const int N = 1010;
    
    char graph[N][N];
    int vis[N][N];
    
    int n, m, cnt;
    
    int targetX[11];
    int targetY[11];
    
    int ans;
    
    int addX[4] = { 1,-1,0,0 };
    int addY[4] = { 0,0,-1,1 };
    
    void bfs(int startX,int startY, int  endX, int endY)
    {
        memset(vis, 0, sizeof vis);
        queue <vector<int>> q;
        q.push({ startX ,startY ,0});
        vis[startX][startY] = 1;
    
        while (!q.empty()) {
            vector<int> v = q.front(); q.pop();
            int step = v[2];
            //找到了目标奶酪
            if (v[0] == endX && v[1] == endY) {
                ans += step;
                return;
            }
    
            for (int i = 0; i < 4; i++) {
                int newx = v[0] + addX[i];
                int newy = v[1] + addY[i];
    
                if (newx >= 0 && newx < n && newy >= 0 && newy < m &&
                    vis[newx][newy] == 0 && graph[newx][newy] != 'X')
                {
                    q.push({newx,newy,step+1});
                    vis[newx][newy]=1;
                }
            }
        }
    
        return ;
    }
    
    int main()
    {
        cin >> n >> m >> cnt;
        int startX = -1; int startY = -1;
        int endX = -1; int endY = -1;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                cin >> graph[i][j];
                if (graph[i][j] == 'S') {
                    startX = i; startY = j;
                    endX = i; endY = j;
                }
                else if (graph[i][j] != '.' && graph[i][j] != 'X') {
                    int idx = graph[i][j] - '0';
                    targetX[idx] = i;
                    targetY[idx] = j;
                }
            }
        }
    
        for (int i = 1; i <= cnt;i++) {
            startX = endX; startY = endY;
            endX = targetX[i]; endY = targetY[i];
            bfs(startX, startY,endX,endY);
        }
    
        cout << ans<<endl;
    
        return 0;
    }

     

  • 相关阅读:
    生产者与消费者
    .net 重新注册
    linux 网络之 bond 网卡模式
    Rancher
    kubernetes 集群
    centos7 网卡命名
    Redis 主从模式
    Redis 集群
    Redis
    TwemProxy Redis架构
  • 原文地址:https://www.cnblogs.com/itdef/p/14287620.html
Copyright © 2020-2023  润新知