迷宫-最短路径距离-BFS

已知条件:

迷宫地图:0-不通,1通

二维数组(N*M)

0 0 0 0 0 0 0 0

0 1 1 0 0 1 0 0

0 0 1 1 1 1 0 0

0 1 1 1 0 1 1 1

1 1 1 0 0 0 0 1

起始点:s(2,2)

求解所有可通过的点到起始点的最短距离。

算法:

#include <iostream>
#include <queue>
#include <fstream>
#include <string>

using namespace std;

typedef pair<int,int> Pos;

int N,M;
//下、右、上、左四个方向
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};

int *src;//迷宫信息数组
int *dist;//各位置到起始点的最短路径距离
int sx,sy;//起始点位置
 
//从文件中读取迷宫地图数据
void readData()
{
	fstream in;
	char c;
	in.open("maze.txt");
	int k = 0;
        int n = 0;
       while(!in.eof())
	{
		in>>c;
		if(c == '\n' || c == ' ')
		{
                    n++;
		}else
		{
			src[k++] = c - '0';
		}
	}
       in.close();
        N = n;
        M = k/n;

        src = new int[N*M]; //分配迷宫数组
	dist = new int [N*M]; //分配距离数组

}
//利用BFS计算路径距离
void bfs(int ex, int ey)//输入终点位置
{
    queue<Pos> que;
int d[N][M]; //临时距离数组

    for(unsigned int i = 0; i < N; i++)
    {
        for(unsigned int j = 0; j < M; j++)
        {
            d[i*N + j] = -1;
        }
    }
    que.push(Pos(sx,sy));
    d[sx * N + sy] = 0;
    while(que.size())
    {
        Pos p = que.front();
        que.pop();
        if(p.first == ex && p.second == ey)
            break;
        for(unsigned int i = 0; i < 4; i++)
        {
            int x = p.first + dx[i];
            int y = p.second + dy[i];
            if(0 <= x && x < N && 0 <= y && y < M && src[x * N + y] != 0 && d[x * N + y] == -1)
            {
                que.push(P(nx,ny));
                d[x * N + y] = d[p.first*N + p.second] + 1;

                            dist[x * N + y] = d[x * N + y]; //更新距离数组

            }
        }
    }
}
int main()
{
    readData();
    for(int i = 0; i < N; i++)
{
for(int j = 0; j < N; j++)
{
if(src[i * N + j] == 1 && dist[i * N+ j] == -1)//跳过计算过的位置
         {
            bfs(i,j);
         }
}
}

    return 0;
}

点赞