游戏地图路径
vivo游戏中心的运营小伙伴最近接到一款新游戏的上架申请,为了保障用户体验,运营同学将按运营流程和规范对其做出分析评估。经过初步了解后分析得知,该游戏的地图可以用一个大小为 n*n 的矩阵表示,每个元素可以视为一个格子,根据游戏剧情设定其中某些格子是不可达的(比如建筑、高山、河流或者其它障碍物等),现在请你设计一种算法寻找从起点出发到达终点的最优抵达路径,以协助运营小伙伴评估该游戏的可玩性和上手难度。
输入描述:
第一行表示矩阵大小 n,5 <n < 10000
第二行表示起点和终点的坐标(笔者注:第一位是纵坐标,第二位是横坐标,示例1是[7,0]和[7,7]两个点)。
第三行起是一个用矩阵表示的游戏地图,其中#或者@表示障碍物,其他字母、非0数字、以及符号+、-、* 等等均表示普通可达格子,共有 n 行 n 列
输出描述:
输出最优路径的长度;若无法到达,则输出-1
示例1
输入
15
0 7 7 7
*5#++B+B+++++$3
55#+++++++###$$
###$++++++#+*#+
++$@$+++$$$3+#+
+++$$+++$+4###+
A++++###$@+$++A
+++++#++$#$$+++
A++++#+5+#+++++
+++$$#$++#++++A
+++$+@$###+++++
+###4+$+++$$+++
+#+3$$$+++$##++
+#*+#++++++#$$+
$####+++++++$##
3$+++B++B++++#5
输出
13
备注:
最优即最短,寻找最优路径时只能按上下左右四个方向前进。
在这里每一步的长度就记为1,本题主要还是采用了DFS算法。代码框架参考了机器人的运动范围这一题。下面是实现代码:
#include<vector>
#include<string>
#include<iostream>
using namespace std;
class Solution {
public:
int exist(vector<vector<char>>& mapch, int si, int sj, int ei, int ej) {
row = mapch.size();
col = mapch[0].size();
vector<vector<int>> visited(row, vector<int>(col, 0)); //用来记录访问与否 和 访问深度
dfs(mapch, visited, si, sj, ei, ej, 1);
return visited[ei][ej] - 1;
}
private:
int row, col;
void dfs(vector<vector<char>>& mapch,vector<vector<int>>& visited, int i, int j, int ei, int ej,int count) {
//几种返回情况说明:
//1. 访问数组下标越界
//2. 已经访问过此位置,并且先前已经有到达此点的更短路径
// visited[i][j]是先前搜索存的深度值,count是此次搜索该点的深度值
//3. 遇到障碍物 “#”和“@”
if (i >= row || j >= col || i < 0 || j < 0
|| (visited[i][j] != 0 && visited[i][j] <= count)
|| mapch[i][j] == '#' || mapch[i][j] == '@')
return;
visited[i][j] = count;
if (i == ei && j == ej) return; //搜索成功
dfs(mapch, visited, i, j + 1, ei, ej, count + 1);
dfs(mapch, visited, i + 1, j, ei, ej, count + 1);
dfs(mapch, visited, i, j - 1, ei, ej, count + 1);
dfs(mapch, visited, i - 1, j, ei, ej, count + 1);
}
};
int main() {
int n; //矩阵大小
cin >> n;
int si, sj, ei, ej; //输入起始位置和终点位置
cin >> si >> sj >> ei >> ej;
vector<vector<char>> mapch(n,vector<char>(n)); //用来存放地图
int i = 0;
getchar(); //吸收换行符
while (i < n) { //按行依次读取
string str;
getline(cin, str);
for (int j = 0; j < n;j++) {
mapch[i][j] = str[j];
}
i++;
}
Solution* st = new Solution();
//在这里传入的时候记得把x和y坐标对调,题目本身输入的问题;
cout << st->exist(mapch, sj, si, ej, ei) << endl;
}
运行结果: