Maze迷宫问题(求最优解)

迷宫地形我们可以通过读文件的形式,通过已知入口逐个遍历坐标寻找通路。

文件如图:

wKiom1cSCnTB8pO4AAAZiAM5LuE146.png

每个坐标的位置用结构体来记录:

struct Pos    //位置坐标
{
   int  _row;
   int _col;
};

 定义行列范围:

#define M 10   //行
#define N 10   //列

初始化迷宫数组
将通过读文件的方式获取的字符转成整型数据,保存在M行N列的数组中。

void InitMaze(int* maze)
{  
    struct WavHeadhWAV;
    FILE* fout = fopen("MazeMap.txt", "r");   // .txt文件要放在当前目录下
    if (fout == NULL)                       // 这里一定要检查读文件是否成功
    {
        cout << "can't find MazeMap.txt !" << endl<<endl;
        return;
    }
    for (int i = 0; i < M; i++)
    {
        for (int j = 0; j < N;)
        {
            char ch = fgetc(fout);
            if (ch=='1'||ch=='0')
            {
                maze[i*N + j] = ch - '0';
                j++;
            }
        }
    }
    fclose(fout);
}

回溯查找通路

利用栈来存储通路,通过上下左右四个方向依次遍历,如果该位置满足条件,就将它入栈,并将该位置的数据置为2;如果四个方向都不满足条件就执行出栈操作,回溯查找满足条件的位置(这时候如果栈为空了,说明查找通路失败),继续循环遍历,直到找到出口为止。

这里建立一个最小栈,如果找到出路,就将该栈赋给最小栈,并将出口置为1,继续回溯查找通路,如果又一次找到通路,就将该栈的长度与最小栈进行比较,如果该栈长度比最小栈还要小,就将它再一次赋给最小栈(保证最小栈是最短的通路),继续回溯,直到整个栈为空,回到了入口,程序结束。

bool SearchMazePath(int *maze, Pos entry, stack<Pos>& paths)   // 利用栈回溯查找通路,并实现迷宫的最优解
{
    assert(maze);
    stack<Pos>min;
    paths.push(entry);
    while (!paths.empty())
    {
        Pos cur = paths.top();
        maze[cur._row*N+cur._col] = 2;
        if (cur._row==M-1)
        {
            if (paths.size()< min.size() || min.size() == 0)
            {
                min = paths;
            }
            paths.pop();
            maze[min.top()._row*N + min.top()._col] = 1;
        }  
        Pos next = cur;
        next._col--;  //左
        if (CheckIsAccess(maze, next))
        {
            paths.push(next);
            maze[next._row*N + next._col] = 2;
            continue;
        }
        next = cur;
        next._col++; //右
        if (CheckIsAccess(maze, next))
        {
            paths.push(next);
            maze[next._row*N + next._col] = 2;
            continue;
        }
        next = cur;
        next._row--; //上
        if (CheckIsAccess(maze, next))
        {
            paths.push(next);
            maze[next._row*N + next._col] = 2;
            continue;
        }
        next = cur;
        next._row++; //下
        if (CheckIsAccess(maze, next))
        {
            paths.push(next);
            maze[next._row*N + next._col] = 2;
            continue;
        }
        paths.pop();
    }
    if (paths.empty()&&!min.empty())
    {
            maze[min.top()._row*N + min.top()._col] = 2;
            return true;
    }
    return false;
}

  检查该位置是否合法:(坐标在行列范围之内)

bool CheckIsAccess(int* maze, const Pos& next)    // 检查该位置是否合法
{
    assert(maze);
    if ((next._row >= 0 && next._row <= N) && (next._col >= 0 && next._col < M) && maze[next._row*N + next._col] == 0)
    {
        return true;
    }
    return false;
}

  打印迷宫:

void PrintMaze(int *maze)   // 打印迷宫
{
    assert(maze);
    for (int i = 0; i < M; i++)
    { 
        for (int j = 0; j < N; j++)
        {
            cout << maze[i*N + j] <<" " ;
        }
        cout << endl;
    }
    cout << endl;  
}

  

 

转载于:https://www.cnblogs.com/Lynn-Zhang/p/5404843.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
广度优先搜索算法可以用来求解迷宫问题最优解。该算法从起点开始,逐层扩展搜索,直到找到终点为止。在搜索过程中,需要记录每个节点的父节点,以便在找到终点后回溯路径。具体步骤如下: 1. 将起点加入队列,并标记为已访问。 2. 从队列中取出一个节点,遍历它的所有相邻节点。 3. 如果相邻节点未被访问过,将其加入队列,并标记为已访问。同时记录该节点的父节点为当前节点。 4. 如果相邻节点是终点,停止搜索。 5. 如果队列为空,说明没有找到终点,搜索失败。 6. 回溯路径,从终点开始,沿着每个节点的父节点一直回溯到起点,即可得到最优解。 下面是一个简单的 Python 代码实现: ```python def bfs(maze, start, end): queue = [start] visited = set([start]) parent = {start: None} while queue: node = queue.pop(0) if node == end: break for neighbor in get_neighbors(maze, node): if neighbor not in visited: queue.append(neighbor) visited.add(neighbor) parent[neighbor] = node if end not in parent: return None path = [] node = end while node: path.append(node) node = parent[node] path.reverse() return path def get_neighbors(maze, node): neighbors = [] for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]: x, y = node[0] + dx, node[1] + dy if 0 <= x < len(maze) and 0 <= y < len(maze[0]) and maze[x][y] == 0: neighbors.append((x, y)) return neighbors ``` 其中,maze 是一个二维数组,表示迷宫地图;start 和 end 分别是起点和终点的坐标。函数返回最优解的路径,如果找不到路径则返回 None。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值