算法思考--------老鼠走迷宫(二)

一、说明

        老鼠走迷宫的入口至出口路径可能不止一条,如何求出所有的路径呢?

二、解法

           通过递归实现:每次递归进入其上下左右继续叠入函数,直达到达出口,而一到达出口,只是输出一次路径,并不结束递归所以每次打印路径后退栈一次,返回到上层函数,继续判断,知道打印出所有的路径

三、代码实现

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

void visit(int, int);
int maze[9][9] = {  {2, 2, 2, 2, 2, 2, 2, 2, 2}, 
					{0, 0, 0, 0, 0, 0, 0, 0, 2}, 
					{2, 0, 2, 2, 0, 2, 2, 0, 2}, 
					{2, 0, 2, 0, 0, 2, 0, 0, 2}, 
					{2, 0, 2, 0, 2, 0, 2, 0, 2}, 
					{2, 0, 0, 0, 0, 0, 2, 0, 2}, 
					{2, 2, 0, 2, 2, 0, 2, 2, 2}, 
					{2, 0, 0, 0, 0, 0, 0, 0, 0}, 
					{2, 2, 2, 2, 2, 2, 2, 2, 2}}; 

int startI = 1, startJ = 0; // 入口
int endI = 7, endJ = 8; // 出口

int main(void)
{
   int i, j;
   printf("显示迷宫 \n");
   for(i = 0; i < 9; i++)
      {
          for(j = 0; j < 9; j++)
              if(maze[i][j] == 2)
                  printf("█");
              else
                  printf("  ");
          printf("\n");
      }
   visit(startI, startJ); 
   return 0;
}

void visit(int i, int j) 
{ 
    int m, n; 
    maze[i][j] = 1; //先假设这条路走得通。实际上这就是遍历出所有的走法,走不通就执行maze[i][j] = 0
    if(i == endI && j == endJ)
	{ 
       printf("显示路径\n"); 
       for(m = 0; m < 9; m++) 
	   { 
           for(n = 0; n < 9; n++) 
               if(maze[m][n] == 2) 
                   printf("█"); 
               else if(maze[m][n] == 1) 
                   printf(" *"); 
               else 
                   printf("  ");
           printf("\n"); 
	   } 
	} 
	if(maze[i][j+1] == 0) //如果上下左右有哪条路能走通就用visit将那个点赋值为1,不要想太复杂
	   visit(i, j+1); //对于多重递归,要抽象看它整体实现的功能,不要过度深究它执行的过程,不然很晕
	if(maze[i+1][j] == 0) 
	   visit(i+1, j); 
	if(maze[i][j-1] == 0) 
	   visit(i, j-1); 
	if(maze[i-1][j] == 0) 
	   visit(i-1, j); 
	maze[i][j] = 0; //如果那条路径走不通,必会返回到这条语句,于是把这点赋值为0,
}
四、 效果展示



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
程序在VC++ 6下顺利编译通过。 一、 实验目的: (1) 熟练掌握链栈的基本操作及应用。 (2) 利用链表作为栈的存储结构,设计实现一个求解迷宫的非递归程序。 、实验内容: 【问题描述】 以一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对信任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 【基本要求】 首先实现一个链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。如:对于下列数据的迷宫,输出的一条通路为:(1,1,1),(1,2,2),(2,2,2),(3,2,3),(3,1,2),……。 【测试数据】 迷宫的测试数据如下:左上角(1,1)为入口,右下角(8,9)为出口。 1 2 3 4 5 6 7 8 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 0 1 0 1 1 1 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 0 0 1 1 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0 以方阵形式输出迷宫及其通路。 输出: 请输入迷宫的长和宽:5 5 请输入迷宫内容: 0 1 1 0 0 0 0 1 1 0 1 0 0 1 1 1 0 0 1 0 1 1 0 0 0 迷宫的路径为 括号内的内容分别表示为(行坐标,列坐标,数字化方向,方向) (1,1,1,↓) (2,1,2,→) (2,2,1,↓) (3,2,1,↓) (4,2,2,→) (4,3,1,↓) (5,3,2,→) (5,4,2,→) (5,5,0,) 迷宫路径探索成功!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值