Maze迷宫问题(求最优解)

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

文件如图:

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

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;
}

  

时间: 2024-09-30 21:31:58

Maze迷宫问题(求最优解)的相关文章

矩阵相乘求最优解(C++算法)

#include "stdafx.h"  #include <iostream>   using namespace std;     const int L = 7;    int RecurMatrixChain(int i,int j,int **s,int *p);//递归求最优解  void Traceback(int i,int j,int **s);//构造最优解    int main()  {      int p[L]={30,35,15,5,10,20

Timus 1642. 1D Maze迷宫

1D people lived in a 1D country. Everything in the country was one-dimensional, and everything was simple and clear: just one axis and two directions - forward and backward. Even a 1D world has problems, though; for instance, finding an exit from a m

Maze迷宫问题

迷宫地形我们可以通过读文件的形式,通过已知入口逐个遍历坐标寻找通路. 文件如图: 每个坐标的位置用Pos来记录: struct Pos    //位置坐标 {    int  _row;    int _col; }; 定义行列范围 #define M 10   //行 #define N 10   //列 初始化迷宫数组:将通过读文件的方式获取的字符转成整型数据,保存在M行N列的数组中. void InitMaze(int* maze) { struct WavHeadhWAV; FILE* 

HDU 4035:Maze 概率DP求期望(有环)

Maze 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4035 题意: 有N(2 ≤ N ≤ 10000)个房间和一堆双向边(不存在环),每个房间有ki和ei两个值,分别代表回到房间1和游戏结束的概率,求游戏结束时通过的边数的期望 题解: 一道很好很经典的求期望的题 设E[i]为以i为起点,直到游戏结束所通过边数的期望,则E[1]即所求答案 设fa代表父亲节点(由于不存在环,则图为一棵树,设1为根节点),∑ch代表所有孩子节点,size代表与这

多机作业排序问题-约翰逊算法和帕尔默法求最优解

0-背景 临近毕业答辩,检测重复率,抽盲审等事宜接踵而至.很不幸,女票抽中盲审.我送助攻,和她一起修改论文,所以,这几天写了点代码,可以整理一下. 多机器作业排序问题很简单,举个栗子??(从她论文中偷了一张图,23333),把所有工件,A,B,C,D加工完要用多久?前提是一台机器只能一次加工一个工件. (1)用时矩阵 工件名称 电炉工时/h 钢包工时/h 模铸工时/h 修磨工时/h A 5 10 7 2 B 10 2 8 9 C 3 6 7 8 D 8 10 1 6 合计 26 28 23 25

洛谷OJ 1141 01迷宫 暴力(求点所在的联通块大小)

https://www.luogu.org/problem/show?pid=1141 题意:n*n地图,0可以走到相邻的某个1上,1可以走到相邻的某个0上,m次询问,问(x,y)能走到多少个格子? n<=1e3,m<=1e5.若点a能到b,则b也能到a.显然a,b能到达的点相同,同一个联通块内的ans是相同的,即求点所在的连通块大小 #include <bits/stdc++.h> using namespace std; const int N=2e3+20; int dx[4

迷宫问题(maze problem)——深度优先(DFS)与广度优先搜索(BFS)求解

1.问题简介 给定一个迷宫,指明起点和终点,找出从起点出发到终点的有效可行路径,就是迷宫问题(maze problem). 迷宫可以以二维数组来存储表示.0表示通路,1表示障碍.注意这里规定移动可以从上.下.左.右四方方向移动.坐标以行和列表示,均从0开始,给定起点(0,0)和终点(4,4),迷宫表示如下: int maze[5][5]={ {0,0,0,0,0}, {0,1,0,1,0}, {0,1,1,0,0}, {0,1,1,0,1}, {0,0,0,0,0} }; 那么下面的迷宫就有两条

[MATLAB] 利用遗传算法函数求目标函数的最优解

最近接触到了遗传算法以及利用遗传算法求最优解,所以就把这些相关的内容整理记录一下. 一.遗传算法简介(摘自维基百科) 遗传算法(英语:genetic algorithm (GA))是计算数学中用于解决最佳化的搜索算法,是进化算法的一种.进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传.突变.自然选择以及杂交等. 算法 选择初始生命种群 循环 评价种群中的个体适应度 以比例原则(分数高的挑中概率也较高)选择产生下一个种群. 改变该种群(交叉和变异) 直到停止循环的条件满足

栈与回溯:迷宫问题

迷宫问题是栈的典型应用,栈通常也与回溯算法连用. 回溯算法的基本描述是: (1)  选择一个起始点: (2)  如果已达目的地, 则跳转到 (4): 如果没有到达目的地, 则跳转到 (3) ; (3)  求出当前的可选项: a.  若有多个可选项,则通过某种策略选择一个选项,行进到下一个位置,然后跳转到 (2); b.  若行进到某一个位置发现没有选项时,就回退到上一个位置,然后回退到 (2) ; (4) 退出算法. 在回溯算法的实现中,通常要使用栈来保存行进中的位置及选项.本文给出自己写的迷宫