bfs简单应用----迷宫问题

【week2-A】

东东有一张地图,想通过地图找到妹纸。地图显示,0表示可以走,1表示不可以走,左上角是入口,右下角是妹纸,这两个位置保证为0。既然已经知道了地图,那么东

东找到妹纸就不难了,请你编一个程序,写出东东找到妹纸的最短路线。

Input

输入是一个5 × 5的二维数组,仅由0、1两数字组成,表示法阵地图。

Output

输出若干行,表示从左上角到右下角的最短路径依次经过的坐标,格式如样例所示。数据保证有唯一解。

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)

Hint

坐标(x, y)表示第x行第y列,行、列的编号从0开始,且以左上角为原点。

  另外注意,输出中分隔坐标的逗号后面应当有一个空格。

基本思路

从起点向终点不断层层逼近(bfs),每次移动的时候都要判断合法性(没有障碍物&&没有墙&&没有访问过)直到到达目的地!

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int row=5,col=5;
const int max_len=25;
typedef struct Node{
	int x,y;
}Node;

int maze[row][col];//存储地图信息

Node **path; //存储路径
//定义移动方向
Node move[4]={{1,0},{-1,0},{0,1},{0,-1}};

bool bfs(Node start,Node end){
	queue<Node> Q;//队列存储
	Q.push(start);
	maze[start.x][start.y]=-1;//将start开始放入
	Node now;
	while(!Q.empty()){
	        now=Q.front();//取出队列首元素
		Q.pop();
		for(int i=0;i<4;i++){
			Node add;//定义下一步要走向的节点
			add.x=now.x+move[i].x ;
			add.y=now.y+move[i].y ;
			if(add.x>=0&&add.y>=0&&add.x<5&&add.y<5
			   &&  maze[add.x][add.y]==0){
			Q.push(add);//没有越界&没有墙&没有访问--->push
		        maze[add.x][add.y]=-1;//当前节点已访问 标记为-1
			path[add.x][add.y]=now;
			}
		}
	}
	if(now.x==end.x&&now.y==end.y)//到达目的节点返回true
		return true;
	return false;
}
void outputpath(Node end){//从尾?头递归,由头?尾输出经历的节点
	Node temp=end;
	if(end.x==0&&end.y==0)
	{
		cout<<"("<<end.x<<", "<<end.y<<")"<<endl;//
		return;
	}  // (0, 0)
	else{
	temp=path[temp.x][temp.y];
	outputpath(temp); //递归输出
	if(!(temp.x==0&&temp.y==0))
		cout<<"("<<temp.x<<", "<<temp.y<<")"<<endl;
	}
	return;
}
int main(){
	for(int i=0;i<5;i++){
		for(int j=0;j<5;j++){
			cin>>maze[i][j];
		}
	}
	Node start={0,0},end={4,4};

	path=new Node*[max_len];

	for(int i=0;i<5;i++)
		path[i]=new Node[5];
	//if(bfs(start,end))
	bfs(start,end);
	outputpath(end);
	cout<<"("<<4<<", "<<4<<")"<<endl;//输出最后一个结点
	return 0;
}

  

原文地址:https://www.cnblogs.com/liuzhuan-xingyun/p/12418689.html

时间: 2024-10-09 08:35:29

bfs简单应用----迷宫问题的相关文章

BFS简单题套路_Codevs 1215 迷宫

BFS 简单题套路 1. 遇到迷宫之类的简单题,有什么行走方向的,先写下面的 声明 const int maxn = 20; struct Status { int r, c; Status(int r = 0, int c = 0) : r(r), c(c) {} // int DIR; }; int N; //迷宫数量 int W; //迷宫宽度 char map[maxn][maxn]; //地图 //方向 : 分别代表 上.右.下.左向量 int dir[4][2] = { {-1, 0

20150917学习内容: 数组,简单的迷宫操作

数组:有固定长度的同种类型的一组变量,有索引,索引从0开始. Int [ ]shuzu = new int[5]; shuzu [0] = 4; shuzu [1] = 6; 或直接赋值: int[]shuzu = new int[5]{2,4,5,7,9}; Console.Write(shuzu[3]); Console.Readline(); 这是一维数组, 二维数组是: int[,] erwei = new int[2,5];   =========>两个长度为5的一维数组 赋值: In

实现简单的迷宫

我们知道栈的特点是:后进先出(First In Last Out);也就是说只能在栈的尾部进 行压栈和出栈,而且出栈的时候只能从最后一个数据开始.   所以我们利用栈这个特点,来实现这个迷宫.在这之中我们要采用"回溯"的方法去处理当遇到路径不通的情况.   原理:每找到一个通路,就将这个数据压栈,这样当前位置的上一个位置就位于栈的顶部,假如当前位置的上下左右都找不到通路的时候,就开始回溯,也就是开始从来的路往回走,而之前走过的路都存在栈里面,所以只需要一个一个的Pop就能依次往回退,每

ACM:图的BFS,走迷宫

题目: 一个网格迷宫由n行m列的单元格组成,每个单元格要么是空地(用1表示),要么是障碍物(用0来表示).你的任务是找一条从起点到终点的最短移动序列,其中UDLR分别表示往上.下.左.右移动到相邻单元格.任何时候都不能在障碍格中,也不能走到迷宫之外.起点和终点保证是空地. 分析:图的BFS. #include <iostream> #include <string> #include <queue> using namespace std; const int MAXN

简单的迷宫(bfs)noj1793

题目描述 睁开眼睛,Bob发现自己被困在一个迷宫里了,是做梦么… 不管那么多了,还是先离开为妙.不过由于恐惧,Bob希望找到一条从入口到出口的最短路径,你能帮帮他么? 这个迷宫相当简单,它是一个N*M的矩形区域,每个格点可以通向相邻上下左右四个格点,起点为(1,1),终点为(N,M).除此之外,迷宫内还有K个点为障碍点,表示他们不可到达,但障碍点不会出现在起点和终点. 输入 组数据输入. 每组数据,第一行N,M,K, 2<=N,M<=50,0<=k<=N*M-2, 接下来k行,每行

BFS简单迷宫

常见迷宫: 输入迷宫 启点 终点 然后求最短路径 BFS例题 用dist[][]数组来记录 启点到每个点的最短路径 1 #include <iostream> 2 #include <fstream> 3 #include <stdio.h> 4 #include <string.h> 5 #include <queue> 6 using namespace std; 7 8 const int maxsize = 128; 9 const in

简单BFS +打印路径 迷宫问题 POJ - 3984

#include<cstdio> #include<iostream> #include<cstring> #include<string> #include<stack> #include<queue> using namespace std; int nex[4][2]= { {0,1},{1,0},{0,-1},{-1,0} }; typedef struct { int x,y; } Point; int a[10][10],

HDU 1253 胜利大逃亡 BFS 简单题

题意: Ignatius要从迷宫的(1,1,1)在时间t内跑到(a,b,c),问可不可能. (题目本来是从(0,0,0)跑到(a-1,b-1,c-1)的) 简单的3维bfs 加剪枝: a+b+c-3>t  速度会快不少. 不过我这里没有加. Input 输入数据的第一行是一个正整数K,表明测试数据的数量.每组测试数据的第一行是四个正整数A,B,C和T(1<=A,B,C<=50,1<=T<=1000),它们分别代表城堡的大小和魔王回来的时间.然后是A块输入数据(先是第0块,然后

HDU2102 A计划 BFS 简单题 有坑点 好题

Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下勇士来拯救公主.不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出.现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示.骑士们一进入时空传输机就会被转到另一层的相对位置