问题描述:

以一个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. 【Luogu】P1879玉米田(状压DP)

    题目链接 数据范围这么小,难度又这么大,一般就是状态压缩DP了. 对输入进行处理,二进制表示每一行的草地状况.如111表示这一行草地肥沃,压缩成7. 所以f[i][j]表示第i行状态为j时的方案数 状 ...

  2. K大数查询(bzoj 3110)

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置 ...

  3. Codeforces956D. Contact ATC

    $n \leq 100000$个飞机在坐标轴上,给坐标给速度,坐标速度异号,还有一个风速在$[-w,w]$区间,$w$比最小的速度绝对值要小.由于风速不知道,所以问有多少对飞机可能在原点相遇. 思维定 ...

  4. AC日记——租用游艇 洛谷 P1359

    题目描述 长江游艇俱乐部在长江上设置了n 个游艇出租站1,2,…,n.游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇.游艇出租站i 到游艇出租站j 之间的租金为r(i,j),1& ...

  5. Codeforces 486D Valid Sets (树型DP)

    题目链接 Valid Sets 题目要求我们在一棵树上计符合条件的连通块的个数. 满足该连通块内,点的权值极差小于等于d 树的点数满足 n <= 2000 首先我们先不管这个限制条件,也就是先考 ...

  6. 马蜂窝ABTest多层分流系统的设计与实现

      什么是 ABTest 产品的改变不是由我们随便「拍脑袋」得出,而是需要由实际的数据驱动,让用户的反馈来指导我们如何更好地改善服务.正如马蜂窝 CEO 陈罡在接受专访时所说:「有些东西是需要 Sen ...

  7. Hadoop安装和基本单机部署

    下载安装  # 下载 $ cd /usr/local $ wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.9.2/hadoo ...

  8. Java抓屏程序代码

    原文:http://www.open-open.com/code/view/1422262655200 import java.awt.Dimension; import java.awt.Recta ...

  9. keras模型总结

    https://keras.io/zh/ https://keras.io/zh/models/about-keras-models/ 在 Keras 中有两类主要的模型:Sequential 顺序模 ...

  10. svn简单介绍

    版本号控制(Revision control)是维护project蓝图的标准做法,能追踪project蓝图从诞生一直到定案的过程.是一种记录若干文件内容变化.以便将来查阅特定版本号修订情况的系统. 能 ...