挑战程序设计竞赛 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;
}

 

原文地址:https://www.cnblogs.com/itdef/p/14287620.html