地址 https://vjudge.net/problem/Aizu-0558
题意大意是 给予一个矩阵,S是起点 .是可以通过的通道 X是不可通过区域, 数字表示各种硬度的强度, 如果小老鼠按照硬度的次序吃下这些奶酪,请问最小要走多少步(上下左右移动一次算一步,可经过奶酪但是不吃) 输入格式为 第一行 三个数字 H,W,N H代表矩阵的高度 W代表矩阵的宽度 N代表各个奶酪的硬度范围 H,W,N (1 ≤ H ≤ 1000,1 ≤ W ≤ 1000,1 ≤ 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; }