题目描述
定义一个二维数组:
int maze[5][5] = {
0, 1, 0, 0, 0,
0, 1, 0, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
};
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
输入
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。输出
左上角到右下角的最短路径,格式如样例所示。样例输入
copy0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0
样例输出
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
来源
#include<iostream>
#include<vector>
using namespace std;
vector<vector<int>>maze;///建立一个vector二维数组存储地图;
vector<vector<int>>path_temp;///建立一个vector二维数组存储路径;
vector<vector<int>>path_best;///建立一个vector二维数组存储最短路经;
void dfs(int x, int y)
{
maze[x][y] = 1;
path_temp.push_back({x,y});///把坐标压入vector
if (x == 4 && y == 4)///边界
if (path_best.empty() || path_temp.size() < path_best.size())
///检查存储最短路径是否为空
path_best = path_temp;///如果此路径较短,归为最短路
int next[4][2]= {{-1,0},{1,0},{0,-1},{0,1}};
for(int k=0; k<=3; k++)
{
int tx=x+next[k][0];
int ty=y+next[k][1];
if(tx>=0&&tx<5&&ty>=0&&ty<5&&maze[tx][ty]==0)
{
maze[tx][ty]=1;
dfs(tx,ty);
maze[tx][ty]=0;
}
}
path_temp.pop_back();///弹出容器的最后一个元素
}
int main()
{
maze = vector<vector<int>>(5,vector<int>(5,0));///声明大小为5*5的二维数组并初始化为0;
for (auto &i : maze)
for (auto &j : i)
cin >> j;///输入一个二维数组
dfs(0, 0);
for (auto i : path_best)///输出最短路径注意格式
cout << '(' << i[0] << ','<<" "<< i[1] << ')' << endl;
}