利用栈寻找迷宫路径

作者在 2015-08-01 12:00:53 发布以下内容

以矩阵形式表示迷宫。请自行脑补一个二维矩阵。

具体思路:如果当前位置的三个方向(除了来时的方向)至少有一个方向可通,则将此点的坐标个可通的方向存入栈顶,如此重复,直到出口;如果当前位置的三个方向都不可通,则表明从当前位置无法再往前走,此时需要将栈顶元素出栈(当前位置的坐标),再沿原路返回到前一个结点,从该点看是否有其他的可行方向,如果也没有,则再往回退一步;如果有,则沿着新的方向向前探索。

#include <stdio.h>
#include <stdlib.h>
//#include "stdirectiono.h"
#define H 6
#define W 6
#define maximum 20
int map[H][W]=            //二维矩阵,0代表可以通过,1代表是墙壁
{
    {1,1,1,1,1,1},
    {1,0,0,0,1,1},
    {1,0,1,0,0,1},
    {1,0,0,0,1,1},
    {1,1,0,0,0,1},
    {1,1,1,1,1,1},
};
int top=-1;
int mindirections=maximum;     //最短路径长度
struct
{
    int i;
    int j;
    int direction;
}Stack[maximum],Path[maximum];
void maze()
{
    int count=-1;
    int i,j,direction,find;
    top++;
    Stack[top].i=1;Stack[top].j=1;
    Stack[top].direction=-1;
    map[1][1]=-1;
    while(top>-1)
    {
        i=Stack[top].i;j=Stack[top].j;
        direction=Stack[top].direction;
        if(i==H-2 && j==W-2)
        {
            int k;
            for(k=0;k<=top;k++)
            {
                printf("[%d,%d]",Stack[k].i,Stack[k].j);
                if((k+1)%5==0)
                    printf("\n");
            }
            printf("\n");
            if(top+1<mindirections)
            {
                for(k=0;k<=top;k++)
                    Path[k]=Stack[k];
                mindirections=top+1;
            }
            map[Stack[top].i][Stack[top].j]=0;
            top--;
            i=Stack[top].i;
            j=Stack[top].j;
            direction=Stack[top].direction;
        }
        find=0;
        while(direction<4&&find==0)
        {
            direction++;
            switch(direction)
            {
                case  0:i=Stack[top].i-1;j=Stack[top].j;break;
                case  1:i=Stack[top].i;j=Stack[top].j+1;break;
                case  2:i=Stack[top].i+1;j=Stack[top].j;break;
                case  3:i=Stack[top].i;j=Stack[top].j-1;break;
            }
            if(map[i][j]==0) find=1;
        }
        if(find==1)
        {
            Stack[top].direction=direction;
            top++;
            Stack[top].i=i;
            Stack[top].j=j;
            Stack[top].direction=-1;
            map[i][j]=-1;
        }
        else
        {
            map[Stack[top].i][Stack[top].j]=0;
            top--;
        }
    }
    printf("最短路径长度:%d\n",mindirections);
    printf("最短路径:\n");
    int k;
    for(k=0;k<mindirections;k++)
    {
        printf("[%d,%d]",Path[k].i,Path[k].j);
        if((k+1)%4)
            printf("\n");
    }
    printf("\n");
}
int main()
{
    printf("迷宫所有路径:\n");
    maze();
    return 0;
}

 

数据结构 | 阅读 2271 次
文章评论,共0条
游客请输入验证码