描述
定义一个二维数组:
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的二维数组,表示一个迷宫。数据保证有唯一解。 输出 左上角到右下角的最短路径,格式如样例所示。 样例输入
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
样例输出
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
如果仙岛求药可以理解,(http://blog.csdn.net/qq_33193309/article/details/55099373) 这题就没有问题了。求最短路径的思路一样。然后就是需要把坐标纪录下来
用结构体存每次走坐标的x,y。跟着路径一起递归。自己多画画很容易理解的
#include<iostream>
using namespace std;
typedef struct S{
int x, y;
}S;
S s[100];
int num = 0;
int step[201][201];
char a[201][201];
int q1, q2, z1, z2;
int pd(int i, int j){
if (i < 0 || j < 0 || i >= 5 || j >= 5 || a[i][j] == '1')
return 0;
return 1;
}
void f(int i, int j, int n){
int x = step[i][j];
s[n].x = i;
s[n].y = j;
if (i == 4 && j == 4){
num = n;
return;
}
if (pd(i + 1, j)){
if (x + 1 < step[i + 1][j]){
step[i + 1][j] = x + 1;
f(i + 1, j, n + 1);
}
}
if (pd(i, j + 1)) {
if (x + 1 < step[i][j + 1]){
step[i][j + 1] = x + 1;
f(i, j + 1, n + 1);
}
}
if (pd(i - 1, j)){
if (x + 1 < step[i - 1][j]) {
step[i - 1][j] = x + 1;
f(i - 1, j, n + 1);
}
}
if (pd(i, j - 1)){
if (x + 1 < step[i][j - 1]){
step[i][j - 1] = x + 1;
f(i, j - 1, n + 1);
}
}
}
int main(){
for (int i = 0; i < 201; i++){
for (int j = 0; j < 201; j++)
step[i][j] = 10000;
}
for (int i = 0; i < 5; i++){
for (int j = 0; j < 5; j++) {
cin >> a[i][j];
}
}
step[0][0] = 0;
f(0, 0, 0);
for (int i = 0;; i++){
printf("(%d, %d)\n", s[i].x, s[i].y);
if (s[i].x == 4 && s[i].y == 4)
break;
}
return 0;
}