问题描述:

以一个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. Codeforces Round #361 (Div. 2)——B. Mike and Shortcuts(BFS+小坑)

    B. Mike and Shortcuts time limit per test 3 seconds memory limit per test 256 megabytes input standa ...

  2. USACO Party Lamps

    题目大意:一排灯有n个,有4种开关,每种开关能改变一些灯现在的状态(亮的变暗,暗的变亮)现在已知一些灯的亮暗情况,问所以可能的情况是哪些 思路:同一种开关开两次显然是没效果的,那么枚举每个开关是否开就 ...

  3. 刷题总结——过河(NOIP2015)

    题目: 题目背景 NOIP2005提高组试题2. 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都 ...

  4. 【基础操作】FFT / DWT / NTT / FWT 详解

    1. 2. 点值表示法 假设两个多项式相乘后得到的多项式 的次数(最高次项的幂数)为 $n$.(这个很好求,两个多项式的最高次项的幂数相加就得到了) 对于每个点,要用 $O(n)$ 的时间 把 $x$ ...

  5. sublime text3安装angularjs插件

    sublime能够支持AngularJS开发那绝对是一件很爽的事情.下面我一步步讲解如何为sublime安装AngularJS插件. 首先提供一个破解版的sublime text 3的下载地址:htt ...

  6. 洛谷P2677 超级书架 2

    题目描述 Farmer John最近为奶牛们的图书馆添置了一个巨大的书架,尽管它是如此的大,但它还是几乎瞬间就被各种各样的书塞满了.现在,只有书架的顶上还留有一点空间. 所有N(1 <= N & ...

  7. 标准C程序设计七---22

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  8. Unity3D 对象池思想 在游戏开发中的运用

    分类:U3D 1.在王者荣耀中,每30秒小兵会出现一波,出现之后会被敌方玩家或敌方小兵销毁,一局游戏下来,小兵会被创建多次,同时也会被销毁,在游戏中,这种频繁的创建和销毁游戏对象是很损耗性能的.在游戏 ...

  9. mysql索引底层的数据结构和算法

    1.       为什么要用索引 索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要. 索 ...

  10. android DatePicker使用

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&q ...