zoukankan      html  css  js  c++  java
  • 老鼠走迷宫(2)输出所有路径(C语言)

    需求  

      有一个迷宫,在迷宫的某个出口放着一块奶酪。将一只老鼠由某个入口处放进去,它必须穿过迷宫,找到奶酪。请找出它的行走路径。

    STEP 1 题目转化

      我们用一个二维数组来表示迷宫,用2表示迷宫的墙壁,用0表示通路。
      老鼠每走到一个格子的时候就将该位置的值置为1,表示老鼠的行走路径包括这个格子。 

    STEP 2 编程思路

      ⑴这个题目可以用递归方法,只需要最后一步走到迷宫出口所在的格子。

      ⑵每一步测试上、下、左、右四个方向,选择一个方向前进。

    STEP 3 要点整理

      ⑴输出所有路径的算法与输出单条路径相同,需要修改的是:打印函数放入递归函数中,才能实现多次输出。

      ⑵在递归选择下一步方向时,if条件添加“x < LEN && y < LEN”,避免溢出。

    ----------------------------------华丽丽的分割线---------------------------代码君要出场了-------------------

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 #define LEN 9
     5 
     6 int maze[LEN][LEN] = {
     7     {2, 0, 2, 2, 2, 0, 2, 2, 2},
     8     {2, 0, 2, 2, 2, 0, 0, 2, 2},
     9     {2, 0, 0, 0, 0, 0, 0, 0, 2},
    10     {2, 0, 2, 2, 0, 2, 2, 0, 2},
    11     {2, 0, 0, 2, 0, 2, 2, 0, 2},
    12     {2, 0, 0, 2, 0, 2, 2, 0, 2},
    13     {2, 0, 0, 2, 0, 0, 0, 0, 0},
    14     {2, 0, 0, 0, 0, 2, 2, 2, 2},
    15     {2, 0, 2, 2, 0, 2, 2, 2, 2},
    16 };                                           //构建迷宫
    17 
    18 int start_x = 1, start_y = 0;               //设置起点
    19 int end_x = 8, end_y = 4;                   //设置终点
    20 
    21 void step(int x, int y);
    22 void print_maze();
    23 
    24 int main(int argc, char argv[])
    25 {    
    26 
    27     printf("maze:
    ");                    //打印迷宫图,为方便查看,将数字换为图形打印
    28     print_maze();
    29 
    30     step(start_x, start_y);
    31 
    32     return 0;
    33 }
    34 
    35 
    36 void step(int x, int y)                //用递归算法求解路径 
    37 {
    38     maze[x][y] = 1;
    39 
    40     if(x == end_x && y == end_y)
    41     {
    42         print_maze();                //打印函数放入递归中,每找到一条成功路径打印一次
    43     }
    44 
    45     if(y < (LEN - 1) && maze[x][y + 1] == 0){step(x, y + 1);}           //边界条件,避免溢出,感谢 @别把白天当黑夜 指正
    46     if(x < (LEN - 1) && maze[x + 1][y] == 0){step(x + 1, y);}
    47     if(y > 0 && maze[x][y - 1] == 0){step(x, y - 1);}
    48     if(x > 0 && maze[x - 1][y] == 0){step(x - 1, y);}
    49 
    50     maze[x][y] = 0;
    51 }
    52 
    53 void print_maze()
    54 {
    55     int x, y;
    56 
    57     for(x = 0; x < LEN; x++)
    58     {
    59         for(y = 0; y < LEN; y++)
    60         {
    61             if(maze[x][y] == 2)
    62                 printf("");
    63             else if(maze[x][y] == 1) 
    64                 printf("");
    65             else if(maze[x][y] == 0)
    66                 printf("");    
    67         }
    68         printf("
    ");
    69     }
    70     
    71     printf("
    ");
    72 }

    欢迎转载,请备注原始连接http://www.cnblogs.com/liuliuliu/p/3885099.html,并注明转载。

    作者bibibi_liuliu,联系方式395985239@qq.com

  • 相关阅读:
    eth私有节点搭建
    angularjs 文件类型格式校验
    Windows Server 2019, 2016 or 2012 安装telnet
    Oracle导致Redo日志暴增的SQL语句排查
    log4j waf 绕过技巧
    jtemplate使用笔记
    NPOI2.0
    关于java同一个类互相调用,spring事务失效问题
    java 将redis的数据批量取出来的时候遇到json格式转换异常
    超级好用的文档转换工具
  • 原文地址:https://www.cnblogs.com/liuliuliu/p/3885099.html
Copyright © 2011-2022 走看看