题解 | #迷宫问题#

迷宫问题

https://www.nowcoder.com/practice/cf24906056f4488c9ddb132f317e03bc

递归遍历
struct xy
{
    int x;
    int y;
};
typedef struct xy XY;
enum direction{UP,DOWN,LEFT,RIGHT};

int findPath(int **road, int curx, int cury, int endx, int endy, XY *paths, int *pathpos, int lastDirection)
{
    int ret;
    int value;
        
    if(curx>endx || curx<0 || cury>endy || cury<0)//越界了且不是右下角
        return 0;
    if(curx==endx && cury==endy)//到达右下角
    {
        paths[*pathpos].x = endx;//加入最后一个坐标
        paths[*pathpos].y = endy;
        (*pathpos)++;
        return 1;//递归返回1
    }
        
    value = *((int* )road+curx*(endy+1)+cury);
    if(value == 0)//查看是不是路“0”
    {
        paths[*pathpos].x = curx;//是路则加入路径栈
        paths[*pathpos].y = cury;
        //printf("+(%d, %d)\n", curx, cury);
        *((int* )road+curx*(endy+1)+cury) = -1;
        (*pathpos)++;
        
        //除原行进相反方向外的其他3个方向都尝试
        if(lastDirection != UP)
        {
            ret = findPath(road, curx+1, cury, endx, endy, paths, pathpos, DOWN);
            if(ret == 1)
                return 1;
        }
        if(lastDirection != LEFT)
        {
            ret = findPath(road, curx, cury+1, endx, endy, paths, pathpos, RIGHT);
            if(ret == 1)
                return 1;
        }
        if(lastDirection != DOWN)
        {
            ret = findPath(road, curx-1, cury, endx, endy, paths, pathpos, UP);
            if(ret == 1)
                return 1;
        }
        if(lastDirection != RIGHT)
        {
            ret = findPath(road, curx, cury-1, endx, endy, paths, pathpos, LEFT);
            if(ret == 1)
                return 1;
        }
        //printf("-(%d, %d)\n", curx, cury);
        (*pathpos)--;//都不通,回退一步,当前坐标出栈
        return 0;//此路不通
    }
    else //不是路撞墙了“1”,或是走过的路“-1”
        return 0;//此路不通
    
}

int main()
{
    int x,y;
    scanf("%d %d", &x, &y);
    int road[x][y];
    XY paths[x+y];
    int pathpos = 0;
    for(int i=0; i<x; i++)
        for(int j=0; j<y; j++)
            scanf("%d", &road[i][j]);
    
    findPath(road, 0,0, x-1,y-1, paths, &pathpos, DOWN);
    for(int i=0; i<pathpos; i++)
    {
        printf("(%d,%d)\n", paths[i].x, paths[i].y);
    }
}


全部评论

相关推荐

ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
尊嘟假嘟点击就送:加v细说,问题很大
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务