题目:
maze.png
如图所示,有一个6 * 6的迷宫,左上角为入口,右下角为出口。图中0的位置可以走,1的位置不能走。请编程找出唯一的一条通过迷宫的路。
解题思路:
1.初始化迷宫:(对二维数组)首先在首尾行各加一行‘1’,首尾列各加两列‘1’(目的为了后面函数四个方向判断时可以将每个数都用一般情况处理)
2.函数设计:
使用递归,对每个数进行判断。通过循环,如果i,j能变到6,6,则成功找到路径,否则没有。其中,当走到每条死路时,值变为0再调回;正确路径则变为-1;返回success
3.主函数:输出二维数组,但用特殊符号显示迷宫
4.对是否找到路径进行判断;如果有则用控制输出迷宫,对其中不同值进行不同符号输出,显示路径
源码:
#include<stdio.h>
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;
}
执行结果:
maze.jpg
总结:
1.首先拿到题没思路,问题归结练习少了
2.有了思路后,但是代码还是无法实现。以上用的递归,但自己也不能运用,只会单纯的公式递归,说明自己的递归有问题。问题为递归做少了,但最大的问题在于对递归的理解不到位,导致有思路但是回到代码也无法下手
3.代码实现能力有待增强