深度优先算法--判断迷宫的一个起点能否到达一个终点
题目描述:
小老鼠Jerry生活在一个庞大的迷宫里,每天靠吃奶酪填饱自己的肚子。一天,它发现自己辛辛苦苦攒积的奶酪不见了。于是在迷宫里开始它的搜寻计划。迷宫是一个N*M(N,M均不超过20)的棋盘,如下图所示:
########
#.####.#
#..#..C#
#.M#..##
#..#..##
#.##...#
#......#
########
其中,“#”表示为一堵墙,Jerry是不能呆在上面的;“.”表示为空地,Jerry可以在上面任意经过,可以自由的向上下左右四个方向行走; “M”表示Jerry开始所在的位置,“C”表示奶酪所在的位置。
你的任务是:在输入中给你迷宫的描述,请问JERRY是否能找回它的奶酪?(也就是JERRY不穿过墙,只在空地上行走,是否存在一条从开始位置到奶酪所在位置的一条道路)。
输入格式:
每个输入文件有多组数据,以0 0作为结束符。每组数据第一行为N和M表示,迷宫有N行M列。接下来N行,每行M个字符描述着迷宫的形状。
输出格式:
对于每组数据,如果JERRY能找到奶酪,就输出“^_^”,否则输出“-_-”。每组数据的结果占据一行。
示例:
输入
8 8
########
#M####.#
#..#..C#
#..#..##
#..#..##
#.##...#
#......#
########
3 5
#####
#M#C#
#####
0 0
输出
^_^
-_-
代码如下:
#include <stdio.h>
#include <stdlib.h>
int n,m,min=99999999,flag=0;
char a[21][21],book[21][21];
// 起点坐标
int startx = 1;
int starty = 1;
// 终点坐标
int finalx = 1;
int finaly = 1;
void dfs(int x,int y,int step){
// 定义一个方向数组
int next[4][2] = {
{ 0, 1}, // 向右走
{ 1,0 }, // 向下走
{ 0, -1 }, // 向左走
{ -1,0 } // 向上走
};
int tx,ty,k;
// 判断是否到达C
if ( x==finalx && y==finaly) {
if(step<min){
min = step;
flag=1;
}
return ;
}
// 枚举四种走法
for( k=0;k<=3;k++ ){
tx = x+next[k][0];
ty = y+next[k][1];
// 判断是否越界
if (tx<1 || tx > n || ty<1 || ty>m ) {
continue;
}
// 判断是否为障碍物或者已经再路径中
if ( a[tx][ty]=='.' && book[tx][ty]==0 ){
book[tx][ty] = 1; // 标记这个点已经走过
dfs(tx,ty,step+1); // 开始尝试下一个点
book[tx][ty] = 0; // 尝试结束,取消这个点的标记
}
}
return ;
}
int main()
{
int i,j;
// 输入n和m,n为行,m为列
scanf("%d%d",&n,&m);
getchar();
while(n!=0&&m!=0){
// 读入迷宫
for(i=1;i<=n;i++) {
for(j=1;j<=m;j++){
scanf("%c",&a[i][j]);
}
getchar();
}
// 读入起点和终点坐标
// scanf("%d %d %d %d",&startx,&starty,&p,&q);
// 找起点坐标
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if(a[i][j]=='M'){
startx=i;
starty=j;
a[i][j]='.';
}
}
}
// 找终点坐标
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if(a[i][j]=='C'){
finalx=i;
finaly=j;
a[i][j]='.';
}
}
}
// 从起点开始搜索
book[startx][starty] = 1; // 标记起点再路径中,防止后面重复走
dfs(startx,starty,0);
printf("JERRY的位置为:%d %d\n",startx,starty);
printf("奶酪的位置为:%d %d\n",finalx,finaly);
if(flag){
printf("^^ ^^\n");
printf(" __\n\n");
printf("最少可以经过%d步找到奶酪\n",min);
}else{
printf("不能找到奶酪!\n");
printf("__ __\n");
printf("\n");
printf(" __ \n\n");
}
scanf("%d%d",&n,&m);
getchar();
// 起点坐标
startx = 1;
starty = 1;
// 终点坐标
finalx = 1;
finaly = 1;
flag = 0;
}
getchar();getchar();
return 0;
}
运行截图如下:
转载于:https://www.cnblogs.com/ncuhwxiong/p/7073439.html
深度优先算法--判断迷宫的一个起点能否到达一个终点相关推荐
- 利用广度优先和深度优先算法解决迷宫问题【算法设计与分析】<图搜索问题>
实验问题: 给定一个n*n的迷宫,要求利用广度优先和深度优先算法解决迷宫问题 问题分析: 对于此问题首先要明确搜索顺序 可以分为两种方法求解问题:1.广度优先算法2.深度优先算法 (1)对于深度优先算 ...
- 采用矩阵+深度优先算法解决迷宫问题
所谓深度优先算法,百科的解答是这样的 深度优先搜索算法(Depth-First-Search),简称DFS,是搜索算法的一种.是沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所有边都己被 ...
- 《啊哈算法》 解救小哈(深度优先算法——走迷宫实战) P86
#include <stdio.h>int n, m, p, q, min=999999; //n和m分别为行和列, p和q分别为终点的x,y坐标, min是最小步数 int a[51][ ...
- delphi adoquery 上一个下一个_从一个起点冲向下一个起点
瑞洁包头市公安局交通管理支队河西交警大队服务部是瑞洁2020年度八个优秀项目之一.今年以来,服务部力推"标准工程"."优化工程"."弯腰工程" ...
- C语言实现一个走迷宫小游戏(深度优先算法)
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C++的语法(使用Dev-C++并且文件扩展名为.cpp的没有影响),如果有的朋友使用的语言标准是VC6的话可能不支持,所以在修改过后再上传一版, ...
- 基于深度优先算法和A*算法的迷宫游戏开发(Java实现)
先上图 文章目录 一.实验内容 二.深度优先算法生成迷宫 三.A*算法走迷宫 四.结果测试 五.源代码 六.参考文献 一.实验内容 1.要求: 1)迷宫随机生成 2)系统用A*算法寻路,输出路径 3) ...
- 贪吃蛇博弈算法python_算法应用实践:如何用Python写一个贪吃蛇AI
原标题:算法应用实践:如何用Python写一个贪吃蛇AI 前言 这两天在网上看到一张让人涨姿势的图片,图片中展示的是贪吃蛇游戏, 估计大部分人都玩过.但如果仅仅是贪吃蛇游戏,那么它就没有什么让人涨姿势 ...
- 手动搜索迷宫游戏 c语言,C语言实现一个走迷宫小游戏(深度优先算法)
接上一篇万年历博文,还是那位朋友的练习题.这次是使用C语言做一个小游戏程序,三选一(2048.8皇后和迷宫游戏),我选择的是迷宫(文章末尾有程序截图).个人认为这个程序的难点在于迷宫地图的绘制,也就是 ...
- 动画演示深度优先算法搜寻逃出迷宫的路径
深度优先算法(DFS 算法)是什么? 寻找起始节点与目标节点之间路径的算法,常用于搜索逃出迷宫的路径.主要思想是,从入口开始,依次搜寻周围可能的节点坐标,但不会重复经过同一个节点,且不能通过障碍节点. ...
最新文章
- php传输数组给axios
- 30天敏捷结果(19):你在为谁做事?
- navicat怎么导出mysql_navicat怎么把数据库导出
- [转]收集android上开源的酷炫的交互动画和视觉效果:Interactive-animation
- HoloLens开发手记-全息Hologram
- 2021牛客暑期多校训练营7 B-xay loves monotonicity(线段树+不降子序列)
- 域嵌套太深_pyspark如何修改嵌套结构域
- 轻量化网络MobileNet解析
- Android EditText 赋值与取值
- 应用安全测试的发展趋势
- MyBatis 学习之路其一:使用mybatis 创建一个简单的程序
- 计算机电源管理设置,如何修改计算机中设置的显卡电源管理模式
- 没有什么软文是营销圈拯救不了的?
- Bootstrap4动态切换主题
- 微信小程序渐变色按钮,好看的小程序按钮样式
- 推荐几款炫酷的 MySQL 可视化管理工具!好用到爆!!
- python基于pingouin包进行统计分析:使用tost函数执行单样本的双单侧检验(TOST)、以dataframe的形式输出分析结果(包含p值、自由度、bound等)
- vspython版本控制_git进行版本控制心得详谈
- 2021年A特种设备相关管理(锅炉压力容器压力管道)考试报名及A特种设备相关管理(锅炉压力容器压力管道)免费试题
- 如何利用图新地球基于地形数据进行坡度分析?
热门文章
- 大数据标准化白皮书正式发布
- Canvas的save和restore方法
- nginx 安装禅道
- XenDesktop5.0 Add Host使用vSphere5.1客户端注意事项
- linux script $,linux的script命令
- bootstrap table php,bootstrap table Tooltip
- 【Linux】Centos7 解压zip文件
- JavaScript学习总结(一)——ECMAScript、BOM、DOM(核心、浏览器对象模型与文档对象模型)...
- NOIP模拟题——dun
- 10.外观模式(Facade Pattern)