迷宫问题(求最短路径长度和最短路径)

描述

定义一个二维数组: 

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;
}

    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/qq_33193309/article/details/55099554
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞