回溯法求解迷宫路径

main.cpp

#include<iostream>

using namespace std;


const int m=5,p=5;
int Maze[m+2][p+2];
int mark[m+2][p+2];
int SeekPath(int x,int y);


struct offsets
{
    int a,b;
    char *dir;
};
offsets move[4]={{-1,0,"N"},
                 {0,1,"E"},
                 {1,0,"S"},
                 {0,-1,"W"}};


int main()
{
    int i,j;
    for(i=0;i<m+2;i++)
    {
        for(j=0;j<p+2;j++)
        {
            cin>>Maze[i][j];
            mark[i][j]=0;
        }
    }


    mark[1][1]=1;
    if(SeekPath(1,1))
        cout<<"("<<1<<","<<1<<"),"<<"Direction:"<<"E"<<endl;


    return 0;
}


int SeekPath(int x,int y)
{
    int i,g,h;
    char *d;
    if(x==m&&y==p)
        return 1;
    for(i=0;i<4;i++)
    {
        g=x+move[i].a;
        h=y+move[i].b;
        d=move[i].dir;
        if(Maze[g][h]==0&&mark[g][h]==0)/////
        {
            mark[g][h]=1;
            if(SeekPath(g,h))
            {
                cout<<"("<<g<<","<<h<<"),"
                    <<"Direction:"<<move[i].dir<<endl;
                return 1;
            }
        }
        //回溯,换一个方向再试探通向出口的路径
    }
    return 0;
}


注:1.只能实现寻找一条可行的路径

       2.包含N\E\S\W四个方向(按顺时针)

       3.从(1,1)开始,到(m,p)结束

猜你喜欢

转载自blog.csdn.net/qq_38628659/article/details/80270531