POJ-3984 迷宫问题 经典BFS问题

bfs直接适合用在处理数据较少的的题目,如果数据量太大bfs处理不来。
BFS在求解最短路径或者最短步数上有很多的应用。
应用最多的是在走迷宫上。
现在这题的主要难点是在记录上一步的节点,不过这题的数据量比较小,
所以不用队列,用一维数组就好了。结构体内定义一个c变量来记录上一点。
struct eu{
  int x;  //x,y坐标 
  int y;
  int c; //记录上一点 
}q[6*6];

也不用考虑,在转弯节点中的c会不会记录比较远的路径的上一点,因为路径短的比路径长优先遍历了,
此时的转弯节点已经被标记了,所以不用担心被路径长的节点再次访问。
下面我们看代码。
#include<queue>
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int map[5][5],vis[5][5];  //vis记录是否访问 
int d[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};   //上下左右方向 
struct eu{
	 int x;  //x,y坐标 
	 int y;
	 int c; //记录上一点 
}q[6*6];
void print(int head)     //查询输出 
{
	 while(q[head].c!=-1){
		  print(q[head].c);
		  printf("(%d, %d)\n",q[head].x,q[head].y);
		  return ;
	 }
 	printf("(0, 0)\n");
}
void bfs(){
	 struct eu now;
	 int head=0;
	 int tail=1;
	 q[head].c=-1;
	 q[head].x=q[head].y=0;
	 vis[0][0]=1;
	 while(head<tail){
		 if(q[head].x==4&&q[head].y==4){   //找到终点 
			   print(head);
			   return ;
		  }
		  for(int i=0;i<4;i++){       //逐个查询节点 
			   now.x=q[head].x+d[i][0];
			   now.y=q[head].y+d[i][1];
			   now.c=head;
			   if(now.x<5&&now.y<5&&now.x>=0&&now.y>=0){   //确定边界 
				    if(!vis[now.x][now.y]&&!map[now.x][now.y]){
					    vis[now.x][now.y]=1;
					    q[tail]=now;
					    tail++; 
				   }
	 		  }
		  }
	  	head++;
	 }
}
int main(){
 
	 memset(vis,0,sizeof(vis));
	 for(int i=0;i<5;i++){
		  for(int j=0;j<5;j++){
			   cin>>map[i][j];
		  }
	 }
	 bfs();
	 return 0;
}
		
		
		
		
		
		
		
		
			
			
			
		```
	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值