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

题目:

天花板编程手把手计划-第1期-第2天_第1张图片
maze.png

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

解题思路:

1.初始化迷宫:(对二维数组)首先在首尾行各加一行‘1’,首尾列各加两列‘1’(目的为了后面函数四个方向判断时可以将每个数都用一般情况处理)
2.函数设计:
使用递归,对每个数进行判断。通过循环,如果i,j能变到6,6,则成功找到路径,否则没有。其中,当走到每条死路时,值变为0再调回;正确路径则变为-1;返回success
3.主函数:输出二维数组,但用特殊符号显示迷宫
4.对是否找到路径进行判断;如果有则用控制输出迷宫,对其中不同值进行不同符号输出,显示路径

源码:

#include

int visit(int i,int j);

int success=0;
int startI=1,startJ=1;
int endI=6,endJ=6;
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},
    };


void main()
{
    int i,j;
    printf("\n显示迷宫:\n");//显示迷宫
    for(i=0;i<8;i++)
    {
        for(j=0;j<8;j++)
        {
            if(maze[i][j]==1)  //值为1时设置为障碍
                printf("█");
                if(maze[i][j]==0)  //值为0时,可以通过
                    printf("  ");
        }
        printf("\n");
    }
    //调用函数,判断是否找到路径
    if(visit(startI,startJ)==0)
    {
        printf("\n没有出口\n");
    }
    else
    {
        printf("\n显示路径:\n");  //如果找到则显示路径
        for(i=0;i<8;i++)
        {
            for(j=0;j<8;j++)
            {
                if(maze[i][j] == 1)         
                    printf("█");
                else 
                    if(maze[i][j] == -1)
                    printf("◇");
                    else
                    printf("  ");
                
            }
                    
            
            printf("\n");
        }
    }
    

    

}

int visit(int i, int j)
{
    maze[i][j] = -1;                        
    if(i == endI && j == endJ)  //如果能到达出口,返回ture
    {               
        success = 1;
    }
    if(success != 1 && maze[i][j+1] == 0)   //判断右侧是否为0
        visit(i, j+1);
    if(success != 1 && maze[i+1][j] == 0)   //判断下侧是否为0
        visit(i+1, j);
    if(success != 1 && maze[i][j-1] == 0)   //判断左侧是否为0
        visit(i, j-1);
    if(success != 1 && maze[i-1][j] == 0)   //判断上侧是否为0
        visit(i-1, j);

    if(success != 1)
        maze[i][j] = 0;

    return success;
}

执行结果:

天花板编程手把手计划-第1期-第2天_第2张图片
maze.jpg

总结:

1.首先拿到题没思路,问题归结练习少了
2.有了思路后,但是代码还是无法实现。以上用的递归,但自己也不能运用,只会单纯的公式递归,说明自己的递归有问题。问题为递归做少了,但最大的问题在于对递归的理解不到位,导致有思路但是回到代码也无法下手
3.代码实现能力有待增强

你可能感兴趣的:(天花板编程手把手计划-第1期-第2天)