01迷宫

前一阶段数据结构让我们通过01迷宫充分理解队列。

01迷宫:以数组表示迷宫,0表示有路,1表示墙体,无法通过。现写一程序,要求可以输入起点和终点,输出由起点到终点的路线。如果没有线路,则输出“没有路线”

我写得代码如下:

#include <iostream>
using namespace std;
int Maze[10][10];//迷宫
int Mark[10][10];//标记走过的点

struct MoveD{
	int x;
	int y;
}Move[4];

struct StepQueue{
	int x;
	int y;
	int prePoint;
}QueueA[100],QueueB[100];

void SetMove(){
	Move[0].x=1;
	Move[0].y=0;
	Move[1].x=-1;
	Move[1].y=0;
	Move[2].x=0;
	Move[2].y=1;
	Move[3].x=0;
	Move[3].y=-1;
	/*Move[4].x=-1;
	Move[4].y=0;
	Move[5].x=-1;
	Move[5].y=-1;
	Move[6].x=0;
	Move[6].y=-1;
	Move[7].x=1;
	Move[7].y=-1;*/
}

void CreateMaze(){
	int i,j;
	for(i=0;i<10;i++){
		for(j=0;j<10;j++){
			Maze[i][j]=0;
		}
	}
	for(i=0;i<10;i++){
		Maze[i][0]=1;
		Maze[0][i]=1;
		Maze[9][i]=1;
		Maze[i][9]=1;
	}
	for(i=2;i<9;i++){
		Maze[2][i]=1;
	}
	for(i=2;i<9;i++){
		Maze[3][i]=1;
	}
	Maze[3][5]=0;
	Maze[4][7]=1;
	Maze[4][8]=1;
	for(i=1;i<9;i++){
		Maze[5][i]=1;
	}
	Maze[5][6]=0;
	for(i=1;i<9;i++){
		Maze[6][i]=1;
	}
	Maze[6][6]=0;
	for(i=2;i<9;i++){
		Maze[8][i]=1;
	}
	for(j=0;j<10;j++){
		for(i=0;i<10;i++){
			cout<<Maze[i][j];
		}
		cout<<endl;
	}
}

int SearchQueue(int x1,int y1,int x2,int y2){
//(x1,y1)起点坐标 ,(x2,y2)终点坐标
	int i,j;
	int front,rear;
	int x,y;
	int v;
	int k,l;
	for(i=0;i<10;i++){
		for(j=0;j<10;j++){
			Mark[i][j]=0;
		}
	}
	QueueA[1].x=x1;
	QueueA[1].y=y1;
	QueueA[1].prePoint=-1;
	front=1;
	rear=1;
	Mark[x1][y1]=1;
	while(front<=rear){
		x=QueueA[front].x;
		y=QueueA[front].y;
		for(v=0;v<4;v++){
			i=x+Move[v].x;
			j=y+Move[v].y;
			if((Mark[i][j]==0)&&(Maze[i][j]==0)){
				rear++;
				QueueA[rear].prePoint=front;
				QueueA[rear].x=i;
				QueueA[rear].y=j;
				Mark[i][j]=1;	
			}
			if(i==x2&&j==y2){
				k=rear;
				l=0;
				while(k>0){
					l++;
					QueueB[l].x=QueueA[k].x;
					QueueB[l].y=QueueA[k].y;
					k=QueueA[k].prePoint;
				}
				while(l>0){
					cout<<"("<<QueueB[l].x<<","<<QueueB[l].y<<")"<<endl;
					l--;
				}
				return(1);
			}
		}		
		front++;
	}
	cout<<"没有通道能到达那一条通道。"<<endl;
	return(0);
}
	
int main(){
	//int i;
	int x1,y1,x2,y2;//开始坐标(x1,y1);结束坐标(x2,y2)
	//int l;//走的步数
	CreateMaze();
	SetMove();
	cout<<"\n请输入起点坐标\n";
	while(cin>>x1>>y1){
		if(Maze[x1][y1]==1){
			cout<<"你输入的初始起点为墙,请重新输入"<<endl;
		}else{
			break;
		}
	}
	cout<<"\n请输入终点坐标\n";
	while(cin>>x2>>y2){
		if(Maze[x2][y2]==1){
			cout<<"你输入的初始起点为墙,请重新输入"<<endl;
		}else{
			break;
		}
	}
	SearchQueue(x1,y1,x2,y2);
	system("pause");
	return 0;
}

   

    另外注意一点,如果起点到终点有两条路线的话,则每点都按右,左,上,下的Move[4]顺序取优先路线,因为如果右取了后,会将其Mark值更改为1,以后则不允许再走此路线了,每条路线只能走一次。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,让我来帮你解决这个问题。这个问题可以用广度优先搜索算法来解决。我们可以从起点开始,依次遍历每个可行的位置,直到找到终点为止。在遍历的过程中,我们需要记录每个位置的步数和路径,以便在找到终点后输出路径。 以下是解决这个问题的伪代码: 1. 初始化起点的步数为0,路径为空,将起点加入队列中 2. 当队列不为空时,取出队首元素 3. 如果当前位置为终点,输出路径并结束程序 4. 遍历当前位置的四个方向,如果该方向可行且未被访问过,则将该位置加入队列中,并更新步数和路径 5. 如果有多个位置步数相同,选择字典序最小的那个位置 6. 重复步骤2-5,直到找到终点或队列为空 以下是实现这个算法的Python代码: from queue import Queue n, m = map(int, input().split()) maze = [list(map(int, input().split())) for _ in range(n)] dx = [0, 0, -1, 1] dy = [-1, 1, 0, 0] visited = [[False] * m for _ in range(n)] steps = [[float('inf')] * m for _ in range(n)] paths = [[''] * m for _ in range(n)] q = Queue() q.put((0, 0)) visited[0][0] = True steps[0][0] = 0 paths[0][0] = '0' while not q.empty(): x, y = q.get() if x == n - 1 and y == m - 1: print(paths[x][y]) break for i in range(4): nx, ny = x + dx[i], y + dy[i] if 0 <= nx < n and 0 <= ny < m and not visited[nx][ny] and maze[nx][ny] == 0: visited[nx][ny] = True steps[nx][ny] = steps[x][y] + 1 if steps[nx][ny] == steps[x][y] + 1: paths[nx][ny] = min(paths[nx][ny], paths[x][y] + str(i)) else: paths[nx][ny] = paths[x][y] + str(i) q.put((nx, ny)) 如果你有任何问题或需要进一步的解释,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值