迷宫问题(OJ平台)附代码解释

迷宫问题(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;
	
}  

路漫漫其修远兮,吾将上下而求索。

Guess you like

Origin blog.csdn.net/weixin_43595755/article/details/107969485