深度优先算法--判断迷宫的一个起点能否到达一个终点

题目描述:

小老鼠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;
}

运行截图如下:

时间: 2024-11-04 05:29:23

深度优先算法--判断迷宫的一个起点能否到达一个终点的相关文章

深度优先算法——走迷宫的实现

深度优先搜索算法(Depth-First-Search),是搜索算法的一种.是沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点.这一过程一直进行到已发现从源节点可达的所有节点为止.如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止.属于盲目搜索. 深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图

深度优先算法生成迷宫——Python实现

import random #warning: x and y confusing sx = 10 sy = 10 dfs = [[0 for col in range(sx)] for row in range(sy)] maze = [[' ' for col in range(2*sx+1)] for row in range(2*sy+1)] #1:up 2:down 3:left 4:right operation = {1:(0,-1),2:(0,1),3:(-1,0),4:(1,0

Java与算法之(5) - 老鼠走迷宫(深度优先算法)

小老鼠走进了格子迷宫,如何能绕过猫并以最短的路线吃到奶酪呢? 注意只能上下左右移动,不能斜着移动. 在解决迷宫问题上,深度优先算法的思路是沿着一条路一直走,遇到障碍或走出边界再返回尝试别的路径. 首先用一个二维数组来把迷宫"数字化". [java] view plain copy print? int[][] maze = new int[5][4]; 迷宫中每个格子的横纵坐标对应数组的一维和二维索引,例如最左上角的格子是maze[0][0],数组的值表示该格子是否可以通过,0表示可以

回文指的是一个字符串从前面读和从后面读都一 样,编写一个算法判断一个字符串是否为回文。

回文指的是一个字符串从前面读和从后面读都一 样,编写一个算法判断一个字符串是否为回文. 要求: 1)采用链栈实现算法: 2)从键盘输入一个字符串,输出判断结果. #include"stdio.h" #include"stdlib.h" typedef char ElemType; typedef struct stnode { ElemType data; struct stnode *next; }StNode, *LinkStack; int huiwen(ch

Dijkstra算法初步 - 迷宫问题

你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数.还有若干双向道路连结这些房间,你沿着这些道路从一个房间走到另外一个房间需要一些时间.游戏规定了你的起点和终点房间,你首要目标是从起点尽快到达终点,在满足首要目标的前提下,使得你的得分总和尽可能大.现在问题来了,给定房间.道路.分数.起点和终点等全部信息,你能计算在尽快离开迷宫的前提下,你的最大得分是多少么? Input 第一行4个整数n (<=500), m, start, end.n表示房

在图中寻找最短路径-----深度优先算法C++实现

求从图中的任意一点(起点)到另一点(终点)的最短路径,最短距离: 图中有数字的点表示为图中的不同海拔的高地,不能通过:没有数字的点表示海拔为0,为平地可以通过: 这个是典型的求图中两点的最短路径:本例,用深度优先算法来实现: 在每一个点都有四个方向(有的点的有些方向不能通过),所以在每一个点处要处理四种方向的情况: 深度优先算法函数怎么写? 也就是写递归函数...但是递归函数肿么写??? 第一:判断初始态,从起点出发,刚开始步数为0:dfs(start_x, start_y, 0); 第二:从起

蚁群算法求解迷宫最优路径问题

本段程序的基本思想是利用蚁群算法中的蚁周模型,来对全局的迷宫图进行信息素的跟新 和为每一只蚂蚁选择下一个方格. 一共会进行RcMax = 2000轮模拟(理论上模拟的次数越多结果 会越接近真实值),而在每一轮中会排除 M = 10只蚂蚁进行探路.同时在算法的回溯思想上采用的 是栈的数据结构来实现的.当栈最终为空时则表示无解.但同时这段程序的一缺点就是:由于我没在 算法中对每一轮的每只探路蚂蚁采用多线程的模式,所以整体的运行效率还不是很高.如读者有好的 思想或建议,请留言. #include<io

[迷宫中的算法实践]迷宫生成算法&mdash;&mdash;Prim算法

       普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小.该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现:并在1957年由美国计算机科学家罗伯特·普里姆(英语:Robert C. Prim)独立发现:1959年,艾兹格·迪科斯彻再次发现了该算法.因此,在某些场合,普里姆

深度优先算法DFS

深度优先算法的Java实现 public class JavaDFS { public int stepnum = 999; /*构建11*11的迷宫,英雄H在(1,1)的位置出发,去解救美女M(6,8),#表示墙壁,*表示炸弹*/ public char[][] graph = { {'#','#','#','#','#','#','#','#','#','#','#'}, {'#','H','_','_','*','_','_','*','_','_','#'}, {'#','_','_',