C++数据结构——迷宫问题之几种走法

2023-10-07 08:10

本文主要是介绍C++数据结构——迷宫问题之几种走法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

迷宫问题之几种走法

在这里插入图片描述

小明某天不小心进入了一个迷宫(如上图所示)。请帮他判断能否出走出迷宫,如果可能,则输出一共有多少种不同的走法(对于某种特定的走法,必须保证不能多次走到同一个位置)。如果不能走到出口,则输出impossible。每次走只能是上、下、左、右4个方向之一。

输入格式:

测试数据有多组,处理到文件尾。每组测试数据首先输入2个整数n,m(0<n,m≤100),代表迷宫的高和宽,然后n行,每行m个字符,各字符的含义如下:
'S’代表小明现在所在的位置;‘T’代表迷宫的出口;’#‘代表墙,不能走;’.'代表路,可以走。

输出格式:

对于每组测试,输出一共有多少种不同的走法,若不能走出则输出impossible。

输入样例:
4 4
S…
#…#
…#.
…T
4 4
S…
#…#
…#.
…#T
输出样例:
4
impossible

代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB

解题代码

#include<bits/stdc++.h>
using namespace std;
int pos[4][2]={-1,0,1,0,0,-1,0,1};	//可以走的位置
int ans;
char mg[102][102];
void findWay(int x,int y)
{if(mg[x][y]=='T'){ans++;return;}queue<int> point;for(int i=0;i<4;i++){if(mg[x+pos[i][0]][y+pos[i][1]]=='.'||mg[x+pos[i][0]][y+pos[i][1]]=='T'){point.push(x+pos[i][0]);point.push(y+pos[i][1]);}}int nx,ny;while(!point.empty()){nx=point.front();point.pop();ny=point.front();point.pop();mg[x][y]='#';findWay(nx,ny);mg[x][y]='.';	//注意回溯}
}int main()
{int n,m;int bx,by;while(cin>>n>>m){ans=0;for(int i=0;i<=n+1;i++){for(int j=0;j<=m+1;j++){mg[i][j]='#';}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>mg[i][j];if(mg[i][j]=='S'){bx=i;by=j;}}}findWay(bx,by);if(ans==0){cout<<"impossible"<<endl;}else{cout<<ans<<endl;}}
}

解题思路

这里用了队列去写,把当前位置周围的四个方向,能够通过的存入队列中,然后再循环出队去递归每一种可走的路径,这里要注意回溯,感觉用队列写比之前的写的要简单很多,代码冗余量比较少。最终只要能到终点就ans++,最后判断ans是不是等于0,等于0就输出impossible就可以了,否则输出ans

这篇关于C++数据结构——迷宫问题之几种走法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/157126

相关文章

Flask解决指定端口无法生效问题

《Flask解决指定端口无法生效问题》文章讲述了在使用PyCharm开发Flask应用时,启动地址与手动指定的IP端口不一致的问题,通过修改PyCharm的运行配置,将Flask项目的运行模式从Fla... 目录android问题重现解决方案问题重现手动指定的IP端口是app.run(host='0.0.

Win32下C++实现快速获取硬盘分区信息

《Win32下C++实现快速获取硬盘分区信息》这篇文章主要为大家详细介绍了Win32下C++如何实现快速获取硬盘分区信息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实现代码CDiskDriveUtils.h#pragma once #include <wtypesbase

Seata之分布式事务问题及解决方案

《Seata之分布式事务问题及解决方案》:本文主要介绍Seata之分布式事务问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Seata–分布式事务解决方案简介同类产品对比环境搭建1.微服务2.SQL3.seata-server4.微服务配置事务模式1

mysql关联查询速度慢的问题及解决

《mysql关联查询速度慢的问题及解决》:本文主要介绍mysql关联查询速度慢的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql关联查询速度慢1. 记录原因1.1 在一次线上的服务中1.2 最终发现2. 解决方案3. 具体操作总结mysql

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

Spring MVC跨域问题及解决

《SpringMVC跨域问题及解决》:本文主要介绍SpringMVC跨域问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录跨域问题不同的域同源策略解决方法1.CORS2.jsONP3.局部解决方案4.全局解决方法总结跨域问题不同的域协议、域名、端口

SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法

《SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法》本文主要介绍了SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录方法1:更改IDE配置方法2:在Eclipse中清理项目方法3:使用Maven命令行在开发Sprin

SpringBoot自定义注解如何解决公共字段填充问题

《SpringBoot自定义注解如何解决公共字段填充问题》本文介绍了在系统开发中,如何使用AOP切面编程实现公共字段自动填充的功能,从而简化代码,通过自定义注解和切面类,可以统一处理创建时间和修改时间... 目录1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3

Python依赖库的几种离线安装方法总结

《Python依赖库的几种离线安装方法总结》:本文主要介绍如何在Python中使用pip工具进行依赖库的安装和管理,包括如何导出和导入依赖包列表、如何下载和安装单个或多个库包及其依赖,以及如何指定... 目录前言一、如何copy一个python环境二、如何下载一个包及其依赖并安装三、如何导出requirem

C++ Primer 标准库vector示例详解

《C++Primer标准库vector示例详解》该文章主要介绍了C++标准库中的vector类型,包括其定义、初始化、成员函数以及常见操作,文章详细解释了如何使用vector来存储和操作对象集合,... 目录3.3标准库Vector定义和初始化vector对象通列表初始化vector对象创建指定数量的元素值