#include <stdio.h>
#include <stdlib.h> #define ROW 10
#define COL 10 /*迷宫中位置信息*/
typedef struct position
{
int x;
int y;
}position; /*在迷宫中的当前位置的信息,也是入栈的基本元素*/
typedef struct SElem
{
int di;
position seat;
}SElem; /*链式栈中节点的定义*/
typedef struct position_stack
{
SElem p;
struct position_stack *next;
}*Stack_pNode,Stack_Node; void InitStack(Stack_pNode *Link)
{
*Link = NULL;
} void push(Stack_pNode *Link,SElem e)
{
Stack_pNode new_SElem = (Stack_pNode)calloc(1,sizeof(Stack_Node));
new_SElem->p = e;
new_SElem->next = NULL;
if (*Link == NULL)
*Link = new_SElem;
else
{
new_SElem->next = *Link;
*Link = new_SElem;
}
} int pop(Stack_pNode *Link,SElem *e)
{
if (*Link == NULL)
return 0;
*e = (*Link)->p;
Stack_pNode q = *Link;
*Link = (*Link)->next;
free(q);
return 1;
} int top(Stack_pNode Link, SElem *e)
{
if (Link == NULL)
return 0;
*e = Link->p;
return 1;
} int empty(Stack_pNode Link)
{
if (Link == NULL)
return 1;
else
return 0;
} int reverse(Stack_pNode *Link)
{
Stack_pNode p, q, r;
if (*Link == NULL || (*Link)->next == NULL)
return 0;
r = *Link;
p = (*Link)->next;
q = NULL;
while (p){
r->next = q;
q = r;
r = p;
p = p->next;
}
r->next = q;
*Link = r;
} void print(Stack_pNode Link)
{
Stack_pNode r = Link;
while (r){
printf("(%d,%d) -> ",r->p.seat.x,r->p.seat.y);
r = r->next;
}
printf("exit\n");
} int curstep = 1;/*纪录当前的足迹,填写在探索前进的每一步正确的路上*/
/*迷宫地图。1代表墙的位置,0代表可行的路,周围有一圈墙*/
int m[ROW+2][COL+2] = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1,
1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1,
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1,
1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1,
1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1,
1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1,
1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,
1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
};
/*方向优先级设定。依次为当前位置的右,下,左。上,在位置信息中。保存有本次 前进的方向--数组的下标*/
position dir_set[4] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } }; /*推断当前位置是否可行。即推断是路。还是墙*/
int pass(position p)
{
if (m[p.x][p.y])
return 0;
else
return 1;
}
/*将当前的步数填写在走的每一步正确的路上,当发现走不通时,会把当时写的信息 用‘1’抹掉,代表走不通。 */
void footPrint(position p)
{
m[p.x][p.y] = curstep;
}
/*计算下一步的坐标。di代表方向。本函数仅仅负责计算下一步坐标。不推断优先级*/
void nextPos(position *p, int di)
{
(*p).x += dir_set[di].x;
(*p).y += dir_set[di].y;
}
/*如上面的footPrint()凝视中提到的,当发现当前路走不通时,会用‘1’把走不通的 路堵上。 */
void markPrint(position p)
{
m[p.x][p.y] = 1;
}
/*迷宫程序的主函数。形參是一个指向不带头节点的栈的指针的指针,一个開始位置 ,一个结束位置*/
int find_path(Stack_pNode * Maze_stack,position start,position end)
{
position curpos = start;/*定义一个位置变量。用来保存当前的位置信息 */
SElem e;/*栈的元素。包含位置信息,和前进的方向*/
do
{
if (pass(curpos)){ /*假设当前节点是路,则要将当前节点入栈。 并计算下一步前进方向*/
footPrint(curpos);/*在前进节点上纪录当前的步数*/
e.seat = curpos;/*保存位置信息*/
e.di = 0;/*保存方向信息。默觉得向右*/
push(Maze_stack, e);/*将位置信息入栈*/
++curstep;/*步数加1*/
if (curpos.x == end.x && curpos.y == end.y)/*假设当 前节点是出口。则返回运行成功的标识*/
return 1;
nextPos(&curpos, e.di);/*计算下一步的坐标。是依据当 前位置信息计算的,即已经入栈了的信息*/
}
else{/*假设当前节点是墙。则须要从栈取出之前走过的路,即沿原 路返回,在返回的过程中,还要不断的推断有没有其它的路*/
if (!empty(*Maze_stack)){/*假设栈中有元素*/
pop(Maze_stack,&e);
--curstep;
while (e.di == 3 && !empty(*Maze_stack)){/* 边向前回溯,边推断是否有其它的路可走*/
markPrint(e.seat);/*用"墙"覆盖之前 填写的步数信息*/
pop(Maze_stack,&e);
--curstep;
}
if (e.di < 3){/*当找到了一个还有其它的路可 走之前走过的一个方块(最坏的情况是回到起始位置)*/
++e.di;/*按优先级改变之前的行走方向 */
push(Maze_stack, e);/*再次入栈*/
++curstep;/*再次将步数加1*/
curpos = e.seat;/*再次纪录如今的位 置*/
nextPos(&curpos, e.di);/*再次计算下 次的方向,有了以上的准备,即将进行下一次的循环*/
}//end if
}//end if
}//end else
} while (!empty(*Maze_stack));
return 0;
} /*打印迷宫*/
void printMaze()
{
int i, j;
for (i = 0; i < ROW+2; ++i)
{
for (j = 0; j < COL+2; ++j){
printf("%2d ", m[i][j]);
}
printf("\n");
} } int main()
{
//stack_test();
position start = { 1, 1 };/*迷宫入口*/
position end = { 10, 10 };/*迷宫出口*/
Stack_pNode maze_stack;/*声明一个栈,一会儿用来存放在迷宫中走过的位 置*/
InitStack(&maze_stack);/*初始化栈*/
if (find_path(&maze_stack, start, end)){
reverse(&maze_stack);/*因为栈中存放的是倒置的信息,须要将栈 倒置*/
print(maze_stack);/*打印带有走过的步数信息的迷宫地图*/
}
else{
printf("Has no way to out of the maze.\n");
}
printMaze(); return 0;
}

用C语言解决迷宫问题的更多相关文章

  1. C语言解决约瑟夫问题详解的代码

    将开发过程中比较重要的一些内容做个收藏,下面的内容是关于C语言解决约瑟夫问题详解的内容,希望能对码农有帮助. #pragma once #include<vector> class PRO ...

  2. 15 GIL 全局解释器锁 C语言解决 top ps

    1.GIL 全局解释器锁:保证同一时刻只有一个线程在运行. 什么是全局解释器锁GIL(Global Interpreter Lock) Python代码的执行由Python 虚拟机(也叫解释器主循环, ...

  3. 有关dfs、bfs解决迷宫问题的个人见解

    可以使用BFS或者DFS方法解决的迷宫问题! 题目如下: kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口.kotori只能上下左右四个方向移动.她想知道有多少出口是 ...

  4. 关于C语言解决汉诺塔(hanoi)问题

    C语言解决汉诺塔问题 汉诺塔是典型的递归调用问题: hanoi简介:印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣 ...

  5. 应用栈解决迷宫问题的C语言实现

    题目来自于严蔚敏<数据结构>,参考伪代码实现的程序: #include <stdio.h> #include <malloc.h> //记录通道块在迷宫矩阵当中的横 ...

  6. 回溯算法-C#语言解决八皇后问题的写法与优化

    结合问题说方案,首先先说问题: 八皇后问题:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 嗯,这个问题已经被使用各种语言解 ...

  7. BFS 、DFS 解决迷宫入门问题

    问题 B: 逃离迷宫二 时间限制: 1 Sec  内存限制: 128 MB提交: 12  解决: 5[提交][状态][讨论版] 题目描述 王子深爱着公主.但是一天,公主被妖怪抓走了,并且被关到了迷宫. ...

  8. 用C语言解决python多线程中的GIL问题

    在使用python多线程的时候为了解决GIL问题,有些代码得用C语言写,那么就得生成动态链接库. 当创建动态链接库时,独立位置信息(position independent)代码也需要生成.这可以帮助 ...

  9. 使用prolog逻辑语言解决爱因斯坦斑马难题

    如果你想获得更好的阅读体验,可以前往我在 github 上的博客进行阅读,http://lcomplete.github.io/blog/2013/06/28/sevenlang-prolog/. 目 ...

随机推荐

  1. javascript获取querystring值【个人觉得这种方法最好最棒最像.NET】

    原文发布时间为:2009-05-22 -- 来源于本人的百度文章 [由搬家工具导入] JavaScript获取QueryString值, 当没有QueryString值时输出bool型 null 用j ...

  2. 【转】利用ScriptManager实现Javascript调用WebService中的方法

    原文发布时间为:2009-07-01 -- 来源于本人的百度文章 [由搬家工具导入] 前台调用后台方法,或者后台调用前台方法。ScriptManager实现 开发过程中,总想在前台直接调用后台的met ...

  3. 使用C#的BitmapData

    原文发布时间为:2009-01-16 -- 来源于本人的百度文章 [由搬家工具导入] 我在前两篇图片处理的文章里几乎都用BitmapData来做图片处理的,那么这个东东究竟是个什么玩意儿呢? C#好是 ...

  4. [LeetCode] Balanced Binary Tree 深度搜索

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...

  5. [LeetCode] Merge Intervals 排序sort

    Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...

  6. 分享C#识别图片上的数字

    通过Emgu实现对图片上的数字进行识别.前期步骤:1.下载Emgu安装文件,我的版本是2.4.2.1777.3.0版本则实现对中文的支持.2.安装后需填写环境变量,环境变量Path值后加入Emgu安装 ...

  7. Linux一些防攻击策略

    来自http://www.imooc.com/learn/344

  8. Jquery 返回json数据在IE浏览器中提示下载的问题

    Jquery 返回json数据,IE浏览器提示下载的问题,当提交完数据后返回的本来是json数据的,在火弧里测试正常,解决方法如下 今天遇到Jquery 返回json数据,IE浏览器提示下载的问题,当 ...

  9. C# ASP.NET中Process.Start没有反应也没有报错的解决方法

    最近有一个很坑的需求,在ASP.NET中打开一个access,还要用process.start打开,调试时一切正常,到了发布后就没有反应,找了一下午,各种设文件夹权限也不行,最后把应用程序池改成管理员 ...

  10. ()centos6.8安装配置ftp服务器

    ftp传输原理 客户端通过某软件用某个端口(a端口)向服务端发起tcp连接请求,同时告诉服务端客户端另一个空闲端口号(b端口),服务端用21端口与客户端建立一条控制连接通道. 接着在默认情况下,服务端 ...