问题描述:

以一个n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍,设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。

对于本问题需用栈实现“穷举求解”算法,即:从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。加入所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。迷宫数据是一个n阶矩阵用二维数组存储,起点为(1,1),终点为(n,n),再在迷宫外围加上一层围墙(默认为1,不需用户输入,用户只需输入迷宫数据即可),对于迷宫中每个数据都有四个方向可通。

具体实现算法的函数及要点如下:初始化栈,销毁栈,清空栈,判栈空,取栈顶元素,插入新的栈顶元素,删除栈顶元素,从栈底到栈顶依次访问栈中的每个结点,最重要的就是要判断迷宫的通路。

从迷宫的入口到出口找出一条通路的算法如下:

设定当前位置的初值为入口位置;

Do

{

若当前位置可通,

{

将当前位置插入栈顶;

若该位置是出口位置,则算法结束;

否则切换当前位置的东邻方块为新的位置;

}

否则

{

回到当前位置的前一个位置,判断是否可通(类似于上面算法)

……

}

}while(栈不空);

若栈不空且栈顶位置尚有其他方向未被探索,

则设定新的当前位置为: 沿顺时针方向旋转

找到的栈顶位置的下一相邻块;

若栈不空但栈顶位置的四周均不可通,

删去栈顶位置;// 从路径中删去该通道块

若栈不空,则重新测试新的栈顶位置,

直至找到一个可通的相邻块或出栈至栈空;

若栈空,则表明迷宫通路。

最后根据栈储存的数据输出迷宫径即可。

递归:

 //
//by coolxxx
//
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define abs(a) ((a)>0?(a):(-(a)))
#define sqr(a) ((a)*(a))
#define swap(a,b) (a)^=(b),(b)^=(a),(a)^=(b)
#define eps 1e-8
#define MAX 0x7f7f7f7f
#define N 1004
#define M 1000004
char map[N][N];
int u[N][N];
int n,m,ans,lll;
int dx[]={-,,,};
int dy[]={,,-,};
int a[M][];
void pop()
{
a[lll][]=a[lll][]=;
lll--;
}
void push(int x,int y)
{
a[++lll][]=x;
a[lll][]=y;
}
void gettop(int *x,int *y)
{
*x=a[lll][];
*y=a[lll][];
}
int uempty()
{
return lll;
}
void init()
{
int i;
memset(a,,sizeof(a));
memset(u,,sizeof(u));
lll=;
}
int dfs(int x,int y)
{
if(x==n && y==n && map[x][y]=='')
return ;
int i,j,xx,yy;
u[x][y]=;
for(i=;i<;i++)
{
xx=x+dx[i];
yy=y+dy[i];
if(xx< || yy< || xx>n || yy>n || map[xx][yy]=='' || u[xx][yy])continue;
j=dfs(xx,yy);
if(j)
{
push(xx,yy);
return ;
}
}
return ;
}
int main()
{
freopen("1.txt","r",stdin);
int i,j;
scanf("%d",&n);
for(i=;i<=n;i++)
{
scanf("%s",map[i]+);
puts(map[i]+);
}
if(map[][]==''){puts("No way");return ;}
init();
if(dfs(,))
{
push(,);
for(i=lll;i>;i--)
printf("(%d,%d)->",a[i][],a[i][]);
printf("(%d,%d)\n",n,n);
}
else
{
puts("No way");
}
return ;
}
/* */

非递归:

 //
//by coolxxx
//
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define abs(a) ((a)>0?(a):(-(a)))
#define sqr(a) ((a)*(a))
#define swap(a,b) (a)^=(b),(b)^=(a),(a)^=(b)
#define eps 1e-8
#define MAX 0x7f7f7f7f
#define N 1004
#define M 1000004
char map[N][N];
int u[N][N];
int n,m,ans,lll;
int dx[]={-,,,};
int dy[]={,,-,};
int a[M][];
void pop()
{
a[lll][]=a[lll][]=;
lll--;
}
void push(int x,int y)
{
a[++lll][]=x;
a[lll][]=y;
}
void gettop(int *x,int *y)
{
*x=a[lll][];
*y=a[lll][];
}
int uempty()
{
return lll;
}
void init()
{
int i;
memset(a,,sizeof(a));
memset(u,,sizeof(u));
lll=;
}
void print()
{
int i,j;
for(i=;i<lll;i++)
printf("(%d,%d)->",a[i][],a[i][]);
printf("(%d,%d)\n",n,n);
}
void dfs()
{
int i,j,x,y,xx,yy;
gettop(&x,&y);
if(x==n && y==n && map[x][y]=='')
{
print();
exit();
}
for(i=;i<;i++)
{
xx=x+dx[i];
yy=y+dy[i];
if(xx< || yy< || xx>n || yy>n || map[xx][yy]=='' || u[xx][yy])continue;
push(xx,yy);
u[xx][yy]=;
dfs();
pop(xx,yy);
}
}
int main()
{
freopen("1.txt","r",stdin);
int i,j;
scanf("%d",&n);
for(i=;i<=n;i++)
{
scanf("%s",map[i]+);
puts(map[i]+);
}
if(map[][]==''){puts("No way");return ;}
push(,);
dfs(,);
puts("No way");
return ;
}
/* */

XMU C语言程序设计实践(3)的更多相关文章

  1. XMU C语言程序设计实践(1)

    题目: 任务1:英雄出世 炎热的夏天午后,小明正在百无聊赖地写c语言程序.忽然,电脑屏幕一阵抖动,浮现下面18×18个看似杂乱无章的数字: 32,  32,  32,  32,  32,  32,  ...

  2. XMU C语言程序设计实践(5)

    •       使用动态链表完成一个简单的商品库存信息管理系统. •       商品信息包括如下字段:商品号.商品名称.商品库存 •       函数 create:接收用户输入的商品号和商品名称的 ...

  3. XMU C语言程序设计实践(4)

    以下实验二选一. 1.使用队列实现迷宫算法,找到最短路径. 2.实现顺序队列和链队列的所有基本操作,InitQueue(&Q):DestroyQueue(&Q):ClearQueue( ...

  4. XMU C语言程序设计实践(2)

    任务一:颠倒的世界 小明最近突然喜欢倒着写字,写出来的句子全是颠倒的,也就是把一句话里的字符全都逆序写,譬如“I Love This Game!”,他就偏偏要写成“!emaG sihT evoL I” ...

  5. 第二章 C语言编程实践

    上章回顾 宏定义特点和注意细节 条件编译特点和主要用处 文件包含的路径查询规则 C语言扩展宏定义的用法 第二章 第二章 C语言编程实践 C语言编程实践 预习检查 异或的运算符是什么 宏定义最主要的特点 ...

  6. C语言程序设计课程总结

    第一次教授C语言程序设计课程,相比计算机组成原理.arm体系结构等偏向硬件的课程,C的教学方式要灵活一些.计算机组成原理课程偏向理论,哈尔滨工业大学的计算机组成原理是国家精品课,增加了mooc+spo ...

  7. 【任务】Python语言程序设计.MOOC学习

    [博客导航] [Python导航] 任务 18年11月29日开始,通过9周时间跨度,投入约50小时时间,在19年1月25日之前,完成中国大学MOOC平台上的<Python语言程序设计>课程 ...

  8. 2019年春季学期《C语言程序设计II》助教注意事项

    本学期<C语言程序设计II>课程安排 理论课时24(1-12周),实验课时8(13周),课程设计课时16(14-15周) 理论课教学内容 附:教学进度表 本学期实验课和课程设计参考教材 & ...

  9. C语言程序设计实习报告

    C语言程序设计实习报告 简介 语言实践心得体会范文在科技高度发展的今天,计算机在人们之中的作用越来越突出.而c语言作为一种计算机的语言,我们学习它,有助于我们更好的了解计算机,与计算机进行交流,因此, ...

随机推荐

  1. BZOJ 1026: [SCOI2009]windy数 【数位dp】

    Description windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数. windy想知道,在A和B之间,包括A和B,总共有多少个windy数? In ...

  2. JS控制背景音乐 没有界面

    建立一个HTML5页面,放置<audio>标签,设置音频文件源,设置循环播放.准备两张图片,分别表示开启和暂停背景音乐两种状态,可以点击. <audio id="music ...

  3. 济南学习 Day 5 T1 am

    炮(cannon)[题目描述]众所周知,双炮叠叠将是中国象棋中很厉害的一招必杀技.炮吃子时必须隔一个棋子跳吃,即俗称“炮打隔子”. 炮跟炮显然不能在一起打起来,于是rly一天借来了许多许多的炮在棋盘上 ...

  4. angular中多控制器的依赖注入写法

    直接看图,每个控制器有自己的名称,第二个参数中有需要注入的依赖对象,最后是我们的自定义函数,这样我们可以以模块化的方式进行书写.

  5. chromedriver错误信息提示

    The open chrome driver window displays: Starting ChromeDriver (v2.8.241075) on port 10820 [8804:7492 ...

  6. bash变量类型详解

    本地变量:作用于当前shell,对当前shell之外的其他shell进程和当前shell子进程均无效. 本地变量赋值为 name='value' value可以是字符串或者是变量,引用变量使用${na ...

  7. fmt 包中的函数和方法

    / Fprintf 将参数列表 a 填写到格式字符串 format 的占位符中// 并将填写后的结果写入 w 中,返回写入的字节数func Fprintf(w io.Writer, format st ...

  8. 51 NOD 1325 两棵树的问题

    Discription 对于 100% 的数据, N<=50. solution: 发现N比较小,所以我们可以花O(N^2)的代价枚举两颗树的联通块的LCA分别是哪个点,然后现在问题就变成了:选 ...

  9. HDFS api操作

    import java.net.URI;import java.util.Iterator;import java.util.Map.Entry; import org.apache.hadoop.c ...

  10. 【chrome错误】Cross origin requests are only supported for protocol schemes: http, data,chrome-extension, https, chrome-extension-reso

    使用ajax请求本地文件,chrome会报跨域错误. XMLHttpRequest cannot loadfile:///C:/Users/Li/Desktop/images/alist.json.C ...