向大家道歉,之前由于我的个人原因,代码中间出现了一些错误,由于时间长,没有及时更改,今天专门检查了一下并且看了评论发现自己之前的代码的确存在问题,谢谢大家的指正,现将改正后代码贴上,如有问题请及时指正。感谢!!!

问题描述

定义一个二维数组:

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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

Input

一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

Output

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

Sample Input

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

思路(DFS寻路)首先将迷宫存在一个二位数组中,然后遍历数组,遇到1则改变方向,遇到0接着向下走,将此点存入栈中,如果无路,则返回上一结点,将此结点移出栈,并将此点的数组值更改为1,防止死循环。直至找到出口。struct path

{

int x; //横座标

int y; //纵座标

struct path *next;

};

typedef struct Link

{

struct path *head;

}link;

//此处已将队列更换为栈,因为之前的队列删除尾节点会将队列结构完全破坏,而造成队列不能正确工作,sorry!!!

//模拟为栈

void push(link *que, int x, int y)

{

struct path *p;

p = (struct path*)malloc(sizeof(struct path));

p->x = x;

p->y = y;

p->next = que->head;;

que->head = p;

/* que->rear->next = p; que->rear = p; que->rear->next = NULL; */

}

void pop(link *que)

{

//如果不合适将刚入栈的节点删除

que->head = que->head->next; //删除栈的头结点就会变得很简单

}

//此处已经不需要这个函数,太多余!

/* void pop2(link *que, int *x, int *y) { struct path *temp; temp = que->head->next; que->head->next = temp->next; //将temp结点出队 *x = temp->x; *y = temp->y; free(temp); } */写好队列的实现后,我们来实现对迷宫的分析,此处没有更正,递归是正确的!/*用递归对迷宫进行遍历*/

void r(int a[5][5], int x, int y, link *que)

{

if( x < 5 && x >= 0 && y < 5 && y >= 0)

{

if(x == 4 && y == 4) //到达迷宫出口

return;

/*首先判断右边下一个点是否可以走*/

if(a[x][y + 1] == 0 && (y + 1) < 5) //此处为了防止数组越界

{

y++;

push(que, x, y); //可以走就将该结点入队

r(a, x, y, que); //递归下一个座标

return;

}

/*上一个条件不满足就判断其向下是否能走*/

if(a[x + 1][y] == 0 && (x + 1) < 5)//防止数组越界

{

x++;

push(que, x, y); //入队

r(a, x, y, que); //递归

return;

}

/*无路可走,就返回上一个座标*/

if(a[x - 1][y] == 0 && x - 1 >= 0)

{

a[x][y] = 1; //并将该点设为1,防止死循环

pop(que); //将该座标移出队列

x--;

r(a, x, y, que);

return;

}

if(a[x][y - 1] == 0 && y - 1 >= 0)

{

a[x][y] = 1;

pop(que); //移出队列

y--;

r(a, x, y, que);

return;

}

}

}

总结

1、用到递归和栈的思想,将迷宫当作矩阵,遍历,判断下一个座标是否可以通过,如果不行则换方向,如果无路可走则退格。

2、自己今天有很多思想没有思考到,写一篇博客加深一下印象。

博客如有错误,欢迎大家评论指出,一起探讨一起进步。感谢!!

完整代码#include

#include

//迷宫问题

struct path

{

int x; //横座标

int y; //纵座标

struct path *next;

};

typedef struct Link

{

struct path *head;

}link;

//模拟为栈

void push(link *que, int x, int y)

{

struct path *p;

p = (struct path*)malloc(sizeof(struct path));

p->x = x;

p->y = y;

p->next = que->head;;

que->head = p;

/* que->rear->next = p; que->rear = p; que->rear->next = NULL; */

}

void pop(link *que)

{

//如果不合适将刚入栈的节点删除

que->head = que->head->next;

}

/* void pop2(link *que, int *x, int *y) { struct path *temp; temp = que->head->next; que->head->next = temp->next; //将temp结点出队 *x = temp->x; *y = temp->y; free(temp); } */

void r(int a[5][5], int x, int y, link *que)

{

if( x < 5 && x >= 0 && y < 5 && y >= 0)

{

if(x == 4 && y == 4)

return;

if(a[x][y + 1] == 0 && (y + 1) < 5)

{

y++;

push(que, x, y);

r(a, x, y, que);

return;

}

if(a[x + 1][y] == 0 && (x + 1) < 5)

{

x++;

push(que, x, y);

r(a, x, y, que);

return;

}

if(a[x - 1][y] == 0 && x - 1 >= 0)

{

a[x][y] = 1;

pop(que);

x--;

r(a, x, y, que);

return;

}

if(a[x][y - 1] == 0 && y - 1 >= 0)

{

a[x][y] = 1;

pop(que);

y--;

r(a, x, y, que);

return;

}

}

}

int main(void)

{

int a[5][5];

int i, j;

int x, y;

for(i = 0; i < 5; i++)

{

for(j = 0; j < 5; j++)

{

scanf("%d", &a[i][j]);

}

}

link *top, *temp;

top = temp = (link *)malloc(sizeof(link));

top->head = (struct path *)malloc(sizeof(struct path));

r(a, 0, 0, top);

printf("(0, 0)\n");

//此处数组是为了存储路径,因为使用的是栈结构,所以存储的路径必然是倒序!

int PATH[25] = {0};

int count = 0;

//将栈倒序的路径存储进数组中,二维数组太占用空间所以此处我们使用一维数组,并使用数学方法存储!!

while(top->head->next != NULL)

{

PATH[count] = top->head->x *10 + top->head->y;

++count;

top->head = top->head->next;

}

for(i = count - 1; i >= 0; --i)

{

int num_x = PATH[i] / 10; //从数据中提取出X

int num_y = PATH[i] % 10; //从数组中提取出Y

//打印路径

printf("(%d, %d)\n", num_x, num_y);

}

return 0;

}

c语言 数组 迷宫,迷宫问题(C语言实现)相关推荐

  1. C语言 数组定义和使用 - C语言零基础入门教程

    目录 一.数组简介 二.定义数组并初始化 1.定义数组 2.初始化数组 三.访问数组 四.修改数组 五.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言 ...

  2. c语言数组判断不及格人数,C语言编程 运用数组求不及格人数

    C语言编程题,求数组89,80,95,84,73,84,91,78,87,94的和以及平均值 #includevoid main(){ int a[10]={89,80,95,84,73,84,91, ...

  3. c语言数组添加字符元素,C语言数组添加和删除元素的实现

    数组不擅长插入(添加)和删除元素.数组的优点在于它是连续的,所以查找数据速度很快.但这也是它的一个缺点.正因为它是连续的,所以当插入一个元素时,插入点后所有的元素全部都要向后移:而删除一个元素时,删除 ...

  4. c语言数组详解视频,C语言数组详解

    <C语言数组详解>由会员分享,可在线阅读,更多相关<C语言数组详解(55页珍藏版)>请在人人文库网上搜索. 1.就是一组具有固定数目的.有序的.类型相同的数据的集合.根据数组下 ...

  5. c语言数组宏定义标识符,C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针...

    目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...

  6. c语言数组的使用步骤,C语言中为什么要使用数组?详细图解数组的使用

    唉,有这么多不同主题的书.在哪里才能找到有关中国音乐的书呢? 数组是可以在内存中连续存储多个元素的结构 数组中的所有元素必须属于相同的数据类型 1.在计算机内存中,同一数组的所有元素按下标顺序依次存放 ...

  7. c语言数组的一维编程,C语言编程一维数组的使用.doc

    C语言编程一维数组的使用 实验 一维数组的使用 [实验目的 1掌握数组定义和初始化方法. 2熟悉使用字符数组处理字符串处理的方法.实验内容10个学生的成绩,求平均成绩,并将低于平均成绩的分数打印出来. ...

  8. c语言 数组初始化非零,C语言与单机-28-数组初始化

    我们定义一个数组,只是在内存中申请了一个连续的地址空间.空间大小是sizeof(data_type)*number.  dat_type指的是数组元素的数据节本类型,sizeof是C语言的运算符,可以 ...

  9. c语言 数组放空自己,DS1307 C语言程序 - ds1307怎么使用(ds1307引脚图及功能_c语言程序及典型应用电路)...

    DS1307 C语言程序 //******************************************************************** //************** ...

  10. c语言数组字符比大小,C语言strncmp函数

    C语言strncmp函数教程 在 strncmp 函数与 strcmp 函数的区别就是,strncmp 函数可以选择比较前 n 个 strncmp函数详解 语法 int strncmp(const c ...

最新文章

  1. C++ Primer笔记12_运算符重载_递增递减运算符_成员訪问运算符
  2. python软件代码示例-Python学习示例源码
  3. 五、开始学习Excel函数,效率快速提高
  4. 2008年夜饭时随手拍的两张照片
  5. 联想继续为其硬件产品完善Linux支持
  6. 6个步骤卸载wine
  7. leetcode 242. 有效的字母异位词 思考分析
  8. 错误: 找不到或无法加载主类 org.apache.flume.tools.GetJavaProperty
  9. HDU 2187 悼念512汶川大地震遇难同胞——老人是真饿了
  10. 物联网安全白皮书_天翼物联网安全白皮书发布 有方科技参与编纂
  11. 如何判断链表中存在环路
  12. Ubuntu系统下ntp服务器搭建
  13. ajax传递json对象 php,PHP传递通过AJAX传递JSON对象数组到前台,前台解析,遍历JSON...
  14. 认证Authentication
  15. 剖析Disruptor:为什么会这么快?(二)神奇的缓存行填充
  16. ArcView GIS 应用与开发技术(10)-影像操作
  17. SQL Server 数据库之数据约束
  18. 简历javaweb项目描述怎么写_从事java开发工作简历怎样写工作描述
  19. ardruino控制继电器_arduino控制继电器
  20. 高中会考计算机都考啥,高中会考都有哪些科目

热门文章

  1. ie6下的iframe,问题多多。
  2. 通过tomcat插件启动Maven工程
  3. [Material Design] MaterialButton 效果进阶 动画自动移动进行对齐效果
  4. Luogu2564 [SCOI2009]生日礼物
  5. BZOJ1008[HNOI2008] 越狱
  6. 企业级NFS网络文件共享服务
  7. java理论知识看了忘_Java基础知识点总结--从细节再看Java(一)
  8. hashtable允许null键和值吗_HashMap 和 Hashtable 的 6 个区别,最后一个没几个人知道!...
  9. python数据处理太慢_使用Python将数据写入LMDB非常慢
  10. arcgis删除栅格数据波段_Web GIS课程7.2 栅格数据的概念及类型