【回溯法】迷宫问题 c++ 🍋

544 阅读2分钟

题目介绍(找出一条路径)

使用二维数组mz[][]记录迷宫

使用ma[][]=dep(变量) 标记路径,从起点dep=1 到终点,dep依次 +1。

方便介绍使用方行迷宫默认起点为左上角,终点为右下角(可自行拓展)

迷宫介绍

  • -1 墙(不可通行)
  • 0 没有走过的路
  • -2 死胡同

算法介绍

  • 当走到终点退出,即mz[i][j]值大于0
  • 对于迷宫采用(x,y)坐标轴(如下图) 所以对(x,y)点 对应mz[y][x]
  • ps.上一条我也不知道为什么搞反了坐标轴 还得拧着想一下💥

#include <iostream>
#include <windows.h>
#include <iomanip>

#define N 10

//可以调整N测试一下较小型的迷宫
//int mz[5][5]={
//        { 0,-1,-1,-1,-1},
//        { 0,-1,-1,-1,-1},
//        { 0,-1,-1,-1,-1},
//        { 0, 0, 0, 0, 0},
//        { 0,-1,-1,-1, 0}
//};

 int mz[10][10]={
         { 0, 0,-1,-1,-1,-1,-1,-1,-1,-1}, // 0
         {-1, 0, 0,-1,-1, 0, 0,-1, 0,-1}, //-1
         {-1, 0, 0,-1, 0, 0, 0,-1, 0,-1}, //2
         {-1, 0, 0, 0, 0,-1,-1, 0, 0,-1}, //3
         {-1, 0,-1,-1,-1, 0, 0, 0, 0,-1}, //4
         {-1, 0, 0, 0,-1, 0, 0, 0, 0,-1}, //5
         {-1, 0,-1, 0, 0, 0,-1, 0, 0,-1}, //6
         {-1, 0,-1,-1,-1, 0,-1,-1, 0,-1}, //7
         {-1,-1, 0, 0, 0, 0, 0, 0, 0, 0}, //8
         {-1,-1,-1,-1,-1,-1,-1,-1,-1, 0}  //9
         //    0 -1 2 3 4 5 6 7 8 9
 };
int dep = 1;

bool walkDown(int x,int y);//从 (x,y) 向下走
bool walkRight(int x,int y);
bool walkUp(int x,int y);
bool walkLeft(int x,int y);
bool doWalk(int x,int y);//从 (x,y)试着走

void showMaze();

using namespace std;

int main(){
    doWalk(0,0);
    showMaze();
    system("pause");
    return 0;
}

void showMaze(){
    for(int i = 0;i<N;i++){
        for(int j =  0;j<N;j++){
            cout.width(3);
            cout.setf(ios::right);
            switch (mz[i][j]){
                case 0:
                    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);//设置红色和绿色相加
                    cout<<"  ?";
                    break;
                case -1:
                    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY);//设置颜色,没有添加颜色,故为原色
                    cout<<"  @";
                    break;
                case -2:
                    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);//设置红色
                    cout<<"  X";
                    break;

                default:
                    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);//设置绿色
                    cout<<mz[i][j];
            }
        }
        cout <<endl;
    }
}
bool doWalk(int x,int y){//试着走 (x,y)
    if(mz[N-1][N-1]> 0){//走到终点了
        return true;
    }else if(mz[y][x]== 0){//之前没走过
        mz[y][x] = dep++;
        if(walkDown(x,y)||walkRight(x,y)||walkUp(x,y)||walkLeft(x,y)){
            return true;
        }else{
            mz[y][x] = -2;//若 这个点的上下左右都不可以走了 就是死胡同
            dep--;
            return false;
        }
    }else {
        return false;
    }
}
bool walkDown(int x,int y){
    if(y==N-1){
        return false;
    }else
    {
        return doWalk(x,y+1);
    }
}
bool walkRight(int x,int y){
    if(x==N-1){
        return false;
    }else
    {
        return doWalk(x+1,y);
    }
}
bool walkUp(int x,int y){
    if(y==0){
        return false;
    }else
    {
        return doWalk(x,y-1);
    }
}
bool walkLeft(int x,int y){
    if(x==0){
        return false;
    }else
    {
        return doWalk(x-1,y);
    }
}

参考

颜色调整 c++怎么设置颜色

原理参照 java版