程序设计思维与实践 Week2 作业A 迷宫问题

本文深入探讨了一种迷宫寻路算法,采用广度优先搜索(BFS)策略,详细讲解了如何从起点出发,寻找通往终点的最短路径。文章通过具体的代码示例,演示了算法的实现过程,包括点的移动、路径记录和最终路径的反向输出。适用于初学者理解和掌握迷宫寻路的基本原理。

在这里插入图片描述
数据:
Sample Input:
0 1 0 0 0
0 1 0 1 0
0 1 0 1 0
0 0 0 1 0
0 1 0 1 0

Sample Output
(0, 0)
(1, 0)
(2, 0)
(3, 0)
(3, 1)
(3, 2)
(2, 2)
(1, 2)
(0, 2)
(0, 3)
(0, 4)
(1, 4)
(2, 4)
(3, 4)
(4, 4)
在这里插入图片描述

#include <iostream>
#include <queue>
#include <stack>

using namespace std;

int a[5][5];   //存放地图的二维数组
queue<int> P;  //用来记录所到达的点的坐标(看学长用的point,但我出问题了,就代替了)
queue<int> Q;
int dx[]={0,0,1,-1};  //移动的横坐标
int dy[]={1,-1,0,0};  //移动的纵坐标


int XX[5][5];  //每到达一个点记录其前一个点的坐标
int YY[5][5];

stack<int> L;  //最后路径反向走一遍再输出得到结果

int main(){
	ios::sync_with_stdio(false);
	
	for(int i=0; i<5; i++){
		for(int j=0; j<5; j	++){
			cin>>a[i][j];
		}  //读入地图
	}
	P.push(0); //到达的点入队列
	Q.push(0);
	a[0][0]=1; //标记
		
	while(!P.empty()){
		int x;
		int y;
		int x1=P.front(); //取出点
		P.pop();
		int y1=Q.front();
		Q.pop();

		for(int i=0; i<4;i++){ //点进行移动
			x=x1+dx[i]; 
			y=y1+dy[i];
			if(x>=0 && x<5 && y>=0 && y<5 && !a[x][y] ){//判断该点是否合法
				XX[x][y]=x1;  //记录前一个点的坐标
				YY[x][y]=y1;
				
				a[x][y]=1; //标记
				P.push(x); //入队列
				Q.push(y);

			}	
		}
		if(x==4 && y==4) break;//若到达出头则停止
	}
		
	a[4][4]=-1;    
	int x=4,y=4;
	L.push(4);
	L.push(4);  //入栈
	while(1){   //将得到的路径反向输出到栈中,得到正向路径
		
		int m=XX[x][y];
		int n=YY[x][y];
		x=m;
		y=n;
		L.push(m);
		L.push(n);
		if(m==0 && n==0) break;
	}
	a[0][0]=-1;

	while(!L.empty()){  //输出路径
		int i=L.top();
		L.pop();
		int j=L.top();
		L.pop();
		cout<<"("<<j<<","<<" "<<i<<")"<<endl;
	}

	
	
	return 0;
}

想法:即从入口处通过bfs进行搜索,直到到达终点,结束搜索。其中注意点的移动,可用两个数组来实现上下左右的移动。在每到达一个点的时候,判断是否合法,即是否在地图外,或者这个点是否已经到达了,又或者是不是障碍。然后记录下每个点的前一个点的坐标,最后到达终点的时候,便可以通过反向遍历得到路径,其可以用栈来实现。

### 山东大学程序设计思维 Week5 旅途不止 相关内容 根据已知的信息,山东大学《程序设计思维实践》课程在第五周的内容涉及多个编程挑战问题,其中包括但不限于“巨石迷阵”、“有惊无险”、“天降甘霖”以及“终而复始”。这些题目通常围绕算法优化、数据结构应用等方面展开[^1]。 对于具体提到的“旅途不止”,虽然未直接提及该题目的详细描述,但从课程整体风格推测,“旅途不止”可能是一个综合性的动态规划或者区间查询类问题。这类问题往往需要处理大规模输入数据(如 \(n < 5 \times 10^5\)),并要求实现高效的解决方案以满足时间复杂度的要求。 以下是基于常见模式的一个假设性解答框架: #### 可能的解法思路 为了高效解决此类问题,可以采用如下方法: - **差分数组技术**:当涉及到频繁修改某个区间的值时,差分数组是一种非常有效的工具。通过维护一个辅助数组 `diff` 来记录原始数组的变化情况,在最后统一计算前缀和即可得到最终结果。 ```python def solve(n, s, queries): diff = [0] * (n + 2) # 初始化差分数组 for l, r in queries: diff[l] += 1 # 左端点加一 diff[r + 1] -= 1 # 右端点之后减去 result = [] current_sum = 0 # 当前累积和初始化为零 for i in range(1, n + 1): # 构造实际的结果序列 current_sum += diff[i] result.append(current_sum) return ''.join([str(x) for x in result]) ``` 上述代码片段展示了如何利用差分数组来快速更新大量连续区域内的数值变化,并能够在线性时间内完成整个过程[^2]。 #### 数据预处理的重要性 针对本题中的字符串操作部分,提前做好必要的转换工作同样至关重要。例如将字符映射成对应的整数形式以便后续更方便地执行逻辑判断等步骤。这种做法不仅简化了编码难度还提高了运行效率。 --- ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值