NOI 2.5.7084迷宫问题 题解(C++)

NOI 2.5.7084迷宫问题 题解(C++)

这几天的题目真的是越来越经典了,这次的题目跟回溯有点关系。

在这里插入图片描述
放心,不是八皇后问题啦。

照例,先搬出原题网址让大家膜拜一下巨佬 刷题网址。
点1下有惊喜

不想点也可以直接看题目吧:
7084:迷宫问题
总时间限制: 1000ms 内存限制: 65536kB

【描述】
定义一个二维数组:
它表示一个迷宫,其中的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

输出就算了

显而易见,这一题是不能用什么玄学做法来解决的。

思路

首先,递归是必须的了,因为说是最短路径,所以肯定是只能向下走或右走,外加一个结构体记录坐标,利用递归枚举向下走和向右走的情况;每次走完一步都要标记一下,走错路再清除标记。
请看代码:

#include
using namespace std;
int maze[5][5];//迷宫的地图 
struct Point{
	int x;
	int y;
};
struct Point pt[50];//用于记录正确路径的结构体,因为是回溯,所以要保存下来逆序输出 
int p = 0;//记录下标 
bool ans = false;//判断找到正确路径了没 

void savePoint(int x, int y){
	pt[p].x = x;
	pt[p].y = y;
	p++;
}//一个无毒无害的小函数,只不过是用来记录坐标的而已 
bool fill(int x,int y){
	if(x == 4&&y == 4){//已经到达目的地 
		maze[4][4] = 2;//最后一个点也要更新掉 
		ans = true;//已经找到过路了 
		return true;
	}
	if(x>4||y>4){
		return false;//挂掉了(超出边界) 
	}
	if(maze[x+1][y] == 0&&x+1<5){//如果下一个方格没走过且不超边界 
		maze[x][y] = 2;//标记为走过 
		if(fill(x+1,y)){ 
			savePoint(x+1, y);
		}
		maze[x][y] = 0;
	}//向下走的情况 
	if(maze[x][y+1] == 0&&y+1<5){ 
		maze[x][y] = 2;
		if(fill(x,y+1)){
			savePoint(x, y+1); 
		}
		maze[x][y] = 0;//因为走错路了,fill中返回了FALSE,所以要把标记清除 
	}//向右走的情况 
}
int main(){
	for(int i = 0;i<5;i++){
		for(int j = 0;j<5;j++){
			cin>>maze[i][j];
		}
	}
	
	fill(0,0);
	for(int i = p;i>=0;i--){
		printf("(%d, %d)\n", pt[i].x, pt[i].y);//printf在这时多好用 
	}
}

你可能感兴趣的:(题解,信息学)