您的位置:首页 > 编程语言 > C语言/C++

老鼠走迷宫(2)输出所有路径(C语言)

2014-08-01 15:29 302 查看

需求  

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

STEP 1 题目转化

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

STEP 2 编程思路

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

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

STEP 3 要点整理

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

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

----------------------------------华丽丽的分割线---------------------------代码君要出场了-----[b]--------------[/b]

#include <stdio.h>
#include <stdlib.h>

#define LEN 9

int maze[LEN][LEN] = {
{2, 0, 2, 2, 2, 0, 2, 2, 2},
{2, 0, 2, 2, 2, 0, 0, 2, 2},
{2, 0, 0, 0, 0, 0, 0, 0, 2},
{2, 0, 2, 2, 0, 2, 2, 0, 2},
{2, 0, 0, 2, 0, 2, 2, 0, 2},
{2, 0, 0, 2, 0, 2, 2, 0, 2},
{2, 0, 0, 2, 0, 0, 0, 0, 0},
{2, 0, 0, 0, 0, 2, 2, 2, 2},
{2, 0, 2, 2, 0, 2, 2, 2, 2},
};                                           //构建迷宫

int start_x = 1, start_y = 0;               //设置起点
int end_x = 8, end_y = 4;                   //设置终点

void step(int x, int y);
void print_maze();

int main(int argc, char argv[])
{

printf("maze:\n");                    //打印迷宫图,为方便查看,将数字换为图形打印
print_maze();

step(start_x, start_y);

return 0;
}

void step(int x, int y)                //用递归算法求解路径
{
maze[x][y] = 1;

if(x == end_x && y == end_y)
{
print_maze();                //打印函数放入递归中,每找到一条成功路径打印一次
}

if(y < (LEN - 1) && maze[x][y + 1] == 0){step(x, y + 1);}           //边界条件,避免溢出,感谢 @别把白天当黑夜 指正
if(x < (LEN - 1) && maze[x + 1][y] == 0){step(x + 1, y);}
if(y > 0 && maze[x][y - 1] == 0){step(x, y - 1);}
if(x > 0 && maze[x - 1][y] == 0){step(x - 1, y);}

maze[x][y] = 0;
}

void print_maze()
{
int x, y;

for(x = 0; x < LEN; x++)
{
for(y = 0; y < LEN; y++)
{
if(maze[x][y] == 2)
printf("■");
else if(maze[x][y] == 1)
printf("☆");
else if(maze[x][y] == 0)
printf("□");
}
printf("\n");
}

printf("\n");
}


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

作者bibibi_liuliu,联系方式395985239@qq.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: