c语言之迷宫问题

版权声明:本文为博主原创文章,未经博主允许不得转载。


定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: 

int maze[5][5] {

        0, 1, 0, 0, 0,

        0, 1, 0, 1, 0,

        0, 0, 0, 0, 0,

        0, 1, 1, 1, 0,

        0, 0, 0, 1, 0,

};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。入口点为[0,0],既第一空格是可以走的路。

Input

一个N × M的二维数组,表示一个迷宫。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。

Output

左上角到右下角的最短路径,格式如样例所示。

Sample Input

0

0

0

0

0

Sample Output

(0, 0)

(1, 0)

(2, 0)

(2, 1)

(2, 2)

(2, 3)

(2, 4)

(3, 4)

(4, 4)

输入描述:
输入两个整数,分别表示二位数组的行数,列数。再输入相应的数组,其中的1表示墙壁,0表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。
输出描述:
左上角到右下角的最短路径,格式如样例所示。
//c语言,用的回溯,栈。
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define Maxsize 100
struct                                      //i,j为当前位置,di为下一个前进的位置,上,右,下,左,分别对应0,1,2,3;
{
     int  i;
     int  j;
     int  di;
}Stack[Maxsize],Path[Maxsize];
int  main()
     {
     int  M,N;
     while ( scanf ( "%d %d" ,&M,&N)!=EOF)
     {
         int  i,j,k,di,find,mg[10][10];
         int  top=-1,minlen=Maxsize;
         memset (mg,0, sizeof (mg));
         for (i=1;i<=M;i++) //输入模块
             for (j=1;j<=N;j++)
                 scanf ( "%d" ,&mg[i][j]);
         for (i=0;i<=N+1;i++) //两个for循环把输入数组的四周全部变成1,防止越界
         {
             mg[0][i]=1;
             mg[M+1][i]=1;
         }
         for (j=1;j<=M;j++)
         {
             mg[j][0]=1;
             mg[j][N+1]=1;
         }
         top++;
         Stack[top].i=1;
         Stack[top].j=1;
         Stack[top].di=-1;
         mg[1][1]=-1;
         while (top>-1)     //输出模块
         {
             i=Stack[top].i;j=Stack[top].j;di=Stack[top].di;
             if (i==M&&j==N)
             {
                 if (top+1
                 {
                     for (k=0;k<=top;k++)
                         Path[k]=Stack[k];
                     minlen=top+1;
                 }
                 mg[Stack[top].i][Stack[top].j]=0;
                 top--;
                 i=Stack[top].i;j=Stack[top].j;di=Stack[top].di;
             }
             find=0;
             while (di<4&&find==0)
             {
                 di++;
                 switch (di)
                 {
                 case  0:i=Stack[top].i-1;j=Stack[top].j; break ;
                 case  1:i=Stack[top].i;j=Stack[top].j+1; break ;
                 case  2:i=Stack[top].i+1;j=Stack[top].j; break ;
                 case  3:i=Stack[top].i;j=Stack[top].j-1; break ;
                 }
                 if (mg[i][j]==0)
                     find=1;
             }
             if (find==1)
             {
                 Stack[top].di=di;
                 top++;
                 Stack[top].i=i;
                 Stack[top].j=j;
                 Stack[top].di=-1;
                 mg[i][j]=-1; //进栈,防止重复,把当前值改为-1;
             }
             else                  //退栈的话,当前值置为0
             {
                 mg[Stack[top].i][Stack[top].j]=0;
                 top--;
             }
         }
         for (k=0;k
             printf ( "(%d,%d)\n" ,(Path[k].i-1),(Path[k].j-1));
     }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值