程序设计Week2作业——A-Maze/B-Pour Water

这篇博客详细介绍了如何解决A-Maze和B-Pour Water两个程序设计问题。对于A-Maze,通过使用bfs算法找到从入口到出口的最短路径,并记录路径;在B-Pour Water问题中,同样利用bfs策略解决倒水问题,直至达到目标水量,输出操作指令。关键在于状态表示、路径记录和状态转移的操作处理。
摘要由CSDN通过智能技术生成

A-Maze

题目描述

根据输入地图,找到从入口(左上角)到出口(右下角)的最短路线,输出路径。地图以0 1序列给出,0代表可通行,1代表有障碍,出入口均保证为0,保证数据有唯一解。

Input

仅由0 1构成的5x5二维数组

Output

以(x, y)坐标形式,输出路径的每个点,每个点占一行,逗号后有一空格

解题思路

  • 用结构体来标识每个具体的位置,用bool数组来标记每个位置是否达到的状态;
  • 因为要输出具体路径,因此使用last[][]数组来记录每个位置的上一个位置(如:last[x][y]=p,表示(x,y)这个位置的上一个位置是p,p是一个位置结构体);
  • 利用dx和dy来实现位置移动,每次对移动后的位置进行条件判定,符合约束边界的位置入队,并将对应位置的vis置为1标识该位置已经走过;
  • 在到达出口时停止搜索,利用last数组,递归输出路径。

实现代码

#include<iostream>
#include<queue>
using namespace std;

int m[5][5];				//地图数组 
bool vis[5][5];				//记录每个点是否经过 
int dx[4]={
   1,-1,0,0};		
int dy[4]={
   0,0,1,-1};		//移动数组 

struct position 
{
   //位置结构体,xy分别为对应坐标 
	int x,y;
};
position last[5][5];		//记录路径中每个位置的上一个位置 
queue<position> q;			 

void output(position p)
{
   //递归形式输出路径 
	if(p.x==0&&p.y==0)
		cout<<"(0, 0)"<<endl;
	else
	{
   
		output(last[p.x][p.y]);
		cout<<"("<<p.x<<", "<<p.y<<")"<<endl;
	}
}

void bfs()
{
   
	//从(0,0)开始,入队,标记vis,展开bfs 
	position start;
	start.x=0;
	start.y=0;
	q.push(start);
	vis[0][0]=1;
	while(!q.empty())
	{
   
		position now=q.front();
		q.pop();
		if(now.x==4&&now.y==4)
		{
   //到达出口,跳出,输出路径 
			output(now);
			break;
		}
		for(int i=0;i<4;++i)
		{
   //四邻域移动 
			int X=now.x+dx[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值