美文网首页
天花板编程手把手计划-第1期-第2天

天花板编程手把手计划-第1期-第2天

作者: 今方信 | 来源:发表于2017-04-24 19:23 被阅读38次

    题目

    如图所示,有一个6 * 6的迷宫,左上角为入口,右下角为出口。图中0的位置可以走,1的位置不能走。请编程找出唯一的一条通过迷宫的路。

    图片.png

    解题思路

    1.题目为6*6矩阵表示的迷宫,在矩阵四周加入1,忽略边界问题方便使用
    2.用1234分别表示方向上、右、下、左。当判断下个路径可走的时候,根据进入该路径的方向设置改路径进入下一个路径的方向。即按照你所面对的方向的左侧。判断是失败的时候顺时针转变方向。(:不懂你在说什么 :额,表述能力有限,哈哈)
    3.当判断下个路径可走的时候,将改路径的值加上2作为标记。并将下个路径的位置设置为当前路径。

    图片.png

    如图当你面对的方向不同的时候,你的左面在平面图上的方位不同,当左左面行不通的时候,顺时针改变方向,直到左面是通的。这种思路在迷宫可解的时候走到出口,不通的时候会回到原点。

    源码

    #include <stdio.h>
    
    #define UPP 1
    #define LOW 3
    #define LEF 4
    #define RIG 2
    
    struct weizhi{
        int x;
        int y;
        int s;
    };
    weizhi NextWeizhi(weizhi now)
    {
        weizhi next1;
        int x = now.x;
        int y = now.y;
    
        switch (now.s)
        {
            case 1: {
                next1.x = x - 1;
                next1.y = y;
                break;
            }
    
            case 2: {
                next1.x = x;
                next1.y = y + 1;
                break;
            }
    
            case 3: {
                next1.x = x + 1;
                next1.y = y;
                break;
            }
    
            case 4: {
                next1.x = x;
                next1.y = y - 1;
                break;
            }
            default:break;
        }
    
        return next1;
    }
    
    int main()
    {
        int i, j;
    
        //定义数组 在四周加上边界
        int maze[8][8] = {
        1,1,1,1,1,1,1,1,
        1,0,1,0,1,1,1,1,
        1,0,0,0,1,0,1,1,
        1,0,1,1,0,0,0,1,
        1,0,1,1,0,1,0,1,
        1,0,0,0,0,1,0,1,
        1,0,1,0,1,1,0,1,
        1,1,1,1,1,1,1,1
        };
        //输出打印迷宫
        printf("这是原来的\n");
        for (i = 1; i < 7; i++)
        {
            for (j = 1; j < 7; j++)
            {
                printf("%d ", maze[i][j]);
            }
            printf("\n");
        }
        //
        weizhi now, next;
        now.x = 1;
        now.y = 1;
        now.s = RIG;
    
        do {
                next = NextWeizhi(now);
                if (maze[next.x][next.y] != 1)
                {
                    maze[now.x][now.y] = maze[now.x][now.y] + 2;
                    now.x = next.x;
                    now.y = next.y;
    
                    if (now.s > 1)
                    {
                        now.s--;
                    }
                    else 
                    {
                        now.s = 4;
                    }
                }
                else
                {
                    if (now.s < 4)
                    {
                        now.s++;
                    }
                    else
                    {
                        now.s = 1;
                    }
    
                }
        } while ( (now.x != 6)||(now.y != 6) );
        //此处有点绕,原来写的是与,发现不对后改成的或
        //输出打印迷宫
        printf("迷宫的解\n");
        for (i = 1; i < 7; i++)
        {
            for (j = 1; j < 7; j++)
            {
                printf("%d ", maze[i][j]);
            }
            printf("\n");
        }
    
        
    
        return 0;
    }
    

    执行结果

    图片.png

    总结

    图中的2表示走过一遍,4位走过两遍。出口判断有带点问题,最后一个没更改。暂时想到这么多。

    相关文章

      网友评论

          本文标题:天花板编程手把手计划-第1期-第2天

          本文链接:https://www.haomeiwen.com/subject/riipzttx.html