C语言实现走迷宫

 更新时间:2020年07月22日 17:10:08   作者:回城之光  
这篇文章主要为大家详细介绍了C语言实现走迷宫,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C语言实现走迷宫的具体代码,供大家参考,具体内容如下

描述

给一张个迷宫,问能否从起点走到终点,只能往上下左右走,不能斜着走

输入

多组测试数据,每组第一行两个正整数,分别为n和m

表示n这个迷宫有n行m列(0<n,m<10)

接着是n行m列,

'#'表示路

‘*'表示墙

‘S'表示起点

‘T'表示终点

输出

每组测试数据输出一个结果,如果能从S走到T,输出“YES”,否则输出“NO”

输入样例:

2 2
S*
#T
3 3
S*#
#T
##

输出样例:

YES
NO

有两种方法可以解决这个问题

第一种深度优先搜索:站在入口,考虑自己下一步可以走哪里,走到下一个位置后,再考虑下一步怎么走,一直走下去,直到没有路,然后再返回最近的一个岔路口,选其它任一条没试过的路,如果不能走,再尝试其他的路,直到这个岔路口的路全部试完,再回到上一个路口,看是否能走到出口,相当于一条路走到黑

#include<bits/stdc++.h>

using namespace std;
char a[20][20];  //存储迷宫字符数组
int flag,m,n;
int sdep_x[4]={-1,1,0,0},sdep_y[4]={0,0,-1,1};//控制上下左右方向
int vis[20][20]; //标记走过的路
void dfs(int x,int y)
{
 vis[x][y]=1; //代表被标记过了
 if(a[x][y]=='T') //找到出口
 {
  flag=1;
  return;
 }
  for(int i=0;i<4;i++) //搜索路径
  {
   int h=x+sdep_x[i];
   int l=y+sdep_y[i];
   if(a[h][l]!='*'&&!vis[h][l]&&h>=0&&h<n&&l>=0&&l<m)//搜索路径的条件
   {
    dfs(h,l);
   }
  }
}

int main()
{
 while(cin>>n>>m)
 {
  memset(vis,0,sizeof(vis));//初始化数组
  flag=0;
  int f,g;
  for(int i=0;i<n;i++)
   for(int j=0;j<m;j++) 
    cin>>a[i][j];
  for(int i=0;i<n;i++)
   for(int j=0;j<m;j++)
   {
    if(a[i][j]=='S')//先找到路口
    {
     f=i;
     g=j;
    }
   }
  dfs(f,g);
  if(flag)
   cout<<"YES"<<endl;
  else
   cout<<"NO"<<endl;
 }
 return 0;
}

第二种方法广度优先搜索:这一步之后,把接下来一步的所有路都列出来,在之后的所有扩展之中,在以一个为下一步,再将所有的该步可以到达的下一步,全部列举出来,再将第二步的其他选择中的每一步,都一一做扩展,每次扩展,都要检查所扩展的地方有没有到达搜索的要求。
可以定义一个队列,将扩展的点位置保存在队列,将扩展完毕的点出队

#include<bits/stdc++.h>
using namespace std;
int vis[20][20];
char a[20][20];
int n,m;
int step_x[4]={-1,1,0,0},step_y[4]={0,0,-1,1};
struct data//定义一个结构体,里面包含x,y成员                                                         
{
 int x;
 int y;
};
data s,p;//定义两个结构体变量
queue<data>q;//定义一个队列q
int BFS()
{
 while(!q.empty())//当队列不为空时
 {
  p=q.front();//返回队列的第一个元素
  vis[p.x][p.y]=1;
  q.pop();//删除队列中最靠前的元素
  if(a[p.x][p.y]=='T')//如果找到出口
   return 1;
  else
  {
   for(int i=0;i<4;i++)
   {
    s.x=p.x+step_x[i];
    s.y=p.y+step_y[i];
    if(s.x>=0&&s.x<n&&s.y>=0&&s.y<m&&!vis[s.x][s.y]&&a[s.x][s.y]!='*')//搜索条件
     q.push(s);//将扩展的点的位置存入队尾
   }
  }
 }
 return 0;
}
int main()
{
 while(cin>>n>>m)
 {
  while(!q.empty())
  {
   q.pop();//清空队列中的元素
  }
  for(int i=0;i<n;i++)
   for(int j=0;j<m;j++)
   cin>>a[i][j];
   for(int i=0;i<n;i++)
   {
   for(int j=0;j<m;j++)
   {
    vis[i][j]=0;
    if(a[i][j]=='S')
    {
     s.x=i;
     s.y=j;
     q.push(s);//将路口的位置保存在队尾
    }
   }
   }
   if(BFS())
   cout<<"YES"<<endl;
   else
   cout<<"NO"<<endl;

 }
 return 0;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C++ auto类型说明符

    C++ auto类型说明符

    在C++11中引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。当然,auto变量必须有初始值,这样编译器才能推断其类型
    2016-03-03
  • C语言中对文件最基本的读取和写入函数

    C语言中对文件最基本的读取和写入函数

    这篇文章主要介绍了C语言中对文件最基本的读取和写入函数,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08
  • C语言数据结构之图书借阅系统

    C语言数据结构之图书借阅系统

    这篇文章主要为大家详细介绍了C语言数据结构之图书借阅系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 使用C++创建多个IPC机制的上层接口

    使用C++创建多个IPC机制的上层接口

    设计一个上层的IPC接口,这个接口将在未来封装底层的通信机制,这样的设计要求接口足够抽象,以便于底层实现的细节对上层用户透明,本文给大家介绍了如何使用C++创建多个IPC机制的上层接口,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • Qt实现自定义矩阵布局

    Qt实现自定义矩阵布局

    这篇文章主要为大家详细介绍了Qt实现自定义矩阵布局,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Qt图形图像开发曲线图表模块QChart库缩放/平移详细方法与实例

    Qt图形图像开发曲线图表模块QChart库缩放/平移详细方法与实例

    这篇文章主要介绍了Qt图形图像开发曲线图表模块QChart库缩放/平移详细方法与实例,需要的朋友可以参考下
    2020-03-03
  • C语言不定长数组及初始化方法

    C语言不定长数组及初始化方法

    今天小编就为大家分享一篇C语言不定长数组及初始化方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • C语言形参和实参传值和传址详解刨析

    C语言形参和实参传值和传址详解刨析

    形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用,形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送
    2021-11-11
  • C++ 单例模式的详解及实例

    C++ 单例模式的详解及实例

    这篇文章主要介绍了C++ 单例模式的详解及实例的相关资料,这里对单例中的懒汉模式和饿汉模式进行实现和比较,需要的朋友可以参考下
    2017-07-07
  • C语言求幂计算的高效解法

    C语言求幂计算的高效解法

    这篇文章主要介绍了C语言求幂计算的高效解法,分别演示了求幂运算与整数次方的解法,具有不错的参考借鉴价值,需要的朋友可以参考下
    2014-09-09

最新评论