迷宫路径 POJ 3984 宽度搜索算法 bfs

原题 

    迷宫问题

题意
int maze[5][5] = {

	0, 1, 0, 0, 0,

	0, 1, 0, 1, 0,

	0, 0, 0, 0, 0,

	0, 1, 1, 1, 0,

	0, 0, 0, 1, 0,

};                    0 代表可以走 ,1 代表障碍 。只有4个方向可以走

Input

      一个5 × 5的二维数组,表示一个迷宫

Output

      左上角到右下角的最短路径

解题思路:

      最短路径的问题一般使用 bfs 宽度优先算法

代码示例:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
int vis[6][6];
int a[6][6];
struct node{      // 结构体中存放 点坐标 及步数
	int x;
	int y;
	int step;
};
bool judge(int x,int y){    // judge 函数判断是否出界或是否走过
	if(x < 0 || y < 0 || x > 4 || y > 4 || vis[x][y] || a[x][y]){
		return false;
	}
	return true;
}
void bfs(int x,int y){
	memset(vis,0,sizeof(vis));
	vis[0][0] = 1;
	node p;
	p.step = 0;
	p.x = x;
	p.y = y;
	queue<node> Q;
	queue<node> qq;
	qq.push(p);
	Q.push(p);
	while(!Q.empty()){
	 	p = Q.front();
	 	Q.pop();
	 	if(p.x == 4 && p.y == 4){    // 到达最终节点
	 		break ;
		}
		for(int i = 0;i < 4;i++){   入队的情况有4中,有可能都入队
		 	node pn;
		 	pn.x = p.x + dx[i];
		 	pn.y = p.y + dy[i];
		 	if(judge(pn.x,pn.y)){
		 		pn.step = p.step + 1;  // 步数加一
		 		vis[pn.x][pn.y] = 1;  
		 		Q.push(pn);     //  符合的情况入队
		 		qq.push(pn);
			 }
		 }
	 }
	int i=0; 
	while(!qq.empty()){ 
	 	node k;
		k = qq.front();
		qq.pop(); 
	 	if(k.step == i){       // 打印与步数相同的 点坐标
	 	 	printf("(%d, %d)\n",k.x,k.y);
	 	 	i++;
		}
	}
} 
int main(){
	for(int i = 0;i < 5;i++){
		for(int j = 0;j < 5;j++){
			scanf("%d",&a[i][j]);
		}
	}
	bfs(0,0);
	return 0;
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值