白书BFS宽度优先搜索

宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。

迷宫问题中和其他算法来解决最短路径问题。

假定有一个迷宫,S为迷宫开始,E为迷宫的结束,迷宫之中“.”为通路,"#",为墙壁,给定特殊迷宫,求能出去的最短路径。

迷宫小于100*100

输入m,n小于100

白书的写法:

 

#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>

using namespace std;

typedef pair<int,int> P;
char migong[102][102];
const int INF = 10000000;
int res,n,m;
int sx,sy;
int gx,gy;
int d[1000][1000];
int dx[4] = {1,0,-1,0};int dy[4] = {0,1,0,-1};
int bfs()
{
	queue<P> que;
	for(int i = 0;i < n;i++)
	{
		for(int j = 0;j < m;j++)
		{
			d[i][j] = INF;
		}
	}
	que.push(P(sx,sy));
	d[sx][sy] = 0;	
	while(que.size())
	{
		P p = que.front();
		que.pop();
		if(p.first == gx && p.second == gy)
		break;
		for(int i = 0;i < 4;i++)
		{
			int nx = p.first + dx[i],ny = p.second + dy[i];
			if(0 <= nx && nx< n && ny < m && ny >= 0 && migong[nx][ny] != '#' && d[nx][ny] == INF)
			{
				que.push(P(nx,ny));
				d[nx][ny] = d[p.first][p.second] + 1;
			}
		}
	}
	return d[gx][gy];
}
int main()
{
	cin >> m >> n;
	for(int i = 0;i < n;i++)
	{
		for(int j = 0;j <m;j++)
		{
			cin >> migong[i][j];
			if(migong[i][j] == 'S')
			{
				sx = i;
				sy = j;
			 } 
			 else if(migong[i][j] == 'E')
			 {
			 	gx = i;
			 	gy = j;
			 }
		}
	}
	cout << sx <<sy << gx <<gy <<endl;
	int res = bfs();
	for(int i = 0;i < n;++i)
	{
		for(int j = 0;j < n;++j)
		{
			cout << d[i][j];
		}
		cout << endl;
	 } 
	cout << res + 1 << endl;
}

个人写法以及见解:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>

using namespace std;

struct node
{
    int x;
    int y;
    int temp;
};
char map[102][102];
int map_bool[102][102];
int tx[4][4] = {0,1,0,-1,1,0,-1,0};//本地方可以使用二维数组来代替遍历的方向,组合分别为{0,1}{1,0}{-1,0}{0,-1}
int sx,sy;
int ex,ey;
int m,n;
int bfs(int sx,int sy)
{
    queue<node>que;
    node l,p;
    l.x = sx;
    l.y = sy;
    l.temp = 0;
    que.push(l);
    map_bool[l.x][l.y] = 0;
    while(!que.empty())
    {
        p = que.front();
        que.pop();
        if(p.x == ex && p.y == ey)
            return p.temp;
        for(int i = 0; i < 4; ++i)
        {
            int nx = p.x + tx[0][i],ny = p.y + tx[1][i];
            if(nx >= 0 && nx < m && ny >= 0 && ny < n && map_bool[nx][ny] == -1 && map[nx][ny] != '#')
            {
                node q;//这个地方注意结构体赋值:q = p,!!!!不正确;
必须一个值一个值的赋。
                q.x = nx;//这个地方注意结构体赋值:q = p,!!!!不正确;
必须一个值一个值的赋。
                q.y = ny;//这个地方注意结构体赋值:q = p,!!!!不正确;
必须一个值一个值的赋。
                q.temp = p.temp;//这个地方注意结构体赋值:q = p,!!!!不正确;
必须一个值一个值的赋。
                q.temp++;
                que.push(q);
                map_bool[nx][ny] = 0;
            }
        }
    }
}
int main()
{
    while(cin >> m >> n)
    {
        memset(map_bool,-1,sizeof(map_bool));//memset初始化为0或-1,其余的值都是乱码。
        for(int i = 0; i < m; ++i)
        {
            for(int j = 0; j < n; ++j)
            {
                cin >> map[i][j];
                if(map[i][j] == 'S')
                {
                    sx = i;
                    sy = j;
                }
                if(map[i][j] == 'E')
                {
                    ex = i;
                    ey = j;
                }
            }
        }
        cout << sx << sy << ex << ey <<endl;
        int t = bfs(sx,sy);
        for(int i = 0; i < m; ++i)
        {
            for(int j = 0; j < n; ++j)
            {
                cout << map_bool[i][j];
            }
            cout << endl;
        }
        cout << t <<endl;
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值