迷宫问题(OJ平台)
http://poj.org/problem?id=3984(这个网址可以A题)
Description
定义一个二维数组:
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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
Input
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。
Output
左上角到右下角的最短路径,格式如样例所示。
Sample Input
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
Sample Output
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
此题的思路:
写这道题时想到Codeup上的走迷宫,做法是一样的:用递归的思想,然后在每一层递归时,对迷宫的四个方向进行判断再递归,用int dx[4] = {0, -1, 0, 1}, dy[4] = {-1, 0, 1, 0}控制四个方向。不同的是:走迷宫这道题是输出所有可能的路径,而这道题只要最短路径的,所以就在递归终点的条件就多了比较路径的 长短,里面多了存目前已知的最短路径的代码
不过这种迷宫的终止条件不是递归的深度到达到某一层,而是走到终点,就return;
代码:
#include<iostream>
using namespace std;
int a[6][6], b[6][6];
int dx[4] = {
0, -1, 0, 1}, dy[4] = {
-1, 0, 1, 0};
int Min = 1000, xx, yy;
int px[1000], py[1000], px1[1000], py1[1000];
void dfs(int x, int y, int index) {
px[index] = x;//用两个数组px[index]和py[index]记录下每个“合格”点的位置
py[index] = y;//每层递归的开始就记录下该点位置
if(x == 4 && y == 4 && index < Min){
//递归终止的条件时走到终点且递归的层数最少
Min = index;
for(int i = 0; i <= Min; ++i){
px1[i] = px[i];//另存最短的路径到px[i]和py[i]
py1[i] = py[i];
}
return;
}
for(int i = 0; i < 4; ++i){
//遍历四个方向
xx = x + dx[i]; //得到下一步的横坐标
yy = y + dy[i]; //得到下一步的纵坐标
if(a[xx][yy] == 0 && b[xx][yy] == 0 && xx <= 4 && xx >= 0 && yy >= 0 && yy <= 4){
//if语句判断下一步是否可走和走过且是否越界
b[x][y] = 1; //标记此点已走过,避免之后重复走
dfs(xx, yy, index + 1);
b[x][y] = 0; // 还原标记,此处即回溯,之后重新进入for循环找下一个可走的点
}
}
}
int main() {
for(int i = 0; i < 5; ++i)
for(int j = 0; j < 5; ++j)
cin>>a[i][j];
dfs(0, 0 ,0);
for(int i = 0; i <= Min; ++i)
cout<<"("<<px1[i]<<", "<<py1[i]<<")"<<endl;
return 0;
}
附:
在OJ平台上做题时,出现了Presentation Error错误,百度一查,发现是答案接近标准答案,只是答案中多了或少了"\n"和空格。结果一看原来是答案中逗号","后面少了空格,。。。。。OJ可真是严格。再附上我走迷宫的垃圾代码,方便比较异同:
#include<bits/stdc++.h>
using namespace std;
int r, c, z1, z2, xx, yy, cnt;
int a[16][16], b[16][16], px[1000], py[1000];
int dx[4] = {
0, -1, 0, 1}, dy[4] = {
-1, 0, 1, 0};
bool flag = false;
void dfs (int x, int y, int index) {
if( x == z1 && y == z2) {
flag = true;
for(int i = 1; i < index; ++i) {
printf("(%d,%d)->", px[i] , py[i]);
}
printf("(%d,%d)\n", z1, z2);
return;
}
px[index] = x;
py[index] = y;
for(int i = 0; i < 4; ++i) {
int x1 = x + dx[i];
int y1 = y + dy[i];
if(a[x1][y1] == 1 && b[x1][y1] == 0 && x1 <= r && x1 >= 1 && y1 >= 1 && y1 <= c) {
b[x][y] = 1;
dfs(x1, y1, index + 1);
b[x][y] = 0;
}
}
}
int main() {
scanf("%d %d", &r, &c);
for(int i = 1; i <= r; ++i) {
for(int j = 1; j <= c; ++j) {
scanf("%d", &a[i][j]);
}
}
scanf("%d %d", &xx, &yy);
scanf("%d %d", &z1, &z2);
dfs(xx, yy, 1);
if(flag == false) {
printf("-1");
}
return 0;
}
路漫漫其修远兮,吾将上下而求索。