首页 > 编程语言 >迷宫,返回所有路径并排序(C++)(回溯+dfs)

迷宫,返回所有路径并排序(C++)(回溯+dfs)

时间:2024-09-07 13:51:52浏览次数:3  
标签:false nums back dfs vector C++ 回溯 path check

题意说明:要求给出一个m*n的矩阵迷宫,0代表入口,1代表道路,2代表墙体,3代表出口,要求返回从入口到出口的所有移动路径并按长短从小到大排序。

移动路径:就是wasd的移动路径,如一共走三步:下,右,下,则输出:sds。

代码如下:

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
//0是入口,1是路,2是墙,3是出口,输入矩阵时输入数字 
class Maze {
public:
	string path;//记录wasd路径
	vector<string> ans;//最后未排序的答案
	vector<vector<bool>> check;//判断路是否来过
	int m, n;
	vector<string> test(vector<vector<int>> nums, int c, int v) {
		m = nums.size();
		n = nums[0].size();
		check = vector<vector<bool>>(m, vector<bool>(n, false));
		dfs(nums, c, v);
		return ans;
	}
	void dfs(vector<vector<int>> nums, int x, int y) {
		if (nums[x][y] == 3) {
			ans.push_back(path);
			return;
		}
		//左
		if (y - 1 >= 0 && nums[x][y - 1] != 2) {
			if (check[x][y - 1] == false) {
				path.push_back('a');
				check[x][y - 1] = true;
				dfs(nums, x, y - 1);
				path.pop_back();
				check[x][y] = false;
			}
		}
		//右
		if (y + 1 < n && nums[x][y + 1] != 2) {
			if (check[x][y + 1] == false) {
				path.push_back('d');
				check[x][y + 1] = true;
				dfs(nums, x, y + 1);
				path.pop_back();
				check[x][y + 1] = false;
			}
		}
		//上
		if (x - 1 >= 0 && nums[x - 1][y] != 2) {
			if (check[x - 1][y] == false) {
				path.push_back('w');
				check[x - 1][y] = true;
				dfs(nums, x - 1, y);
				path.pop_back();
				check[x - 1][y] = false;
			}
		}
		//下
		if (x + 1 < m && nums[x + 1][y] != 2) {
			if (check[x + 1][y] == false) {
				path.push_back('s');
				check[x + 1][y] = true;
				dfs(nums, x + 1, y);
				path.pop_back();
				check[x + 1][y] = false;
			}
		}

	}
	//x-1>=0  x+1<n  y-1>=0  y+1<m
	//0入 1路 2阻 3出口
};

bool compare(string a, string b)
{
	return a.length() < b.length();
}
//排序函数


int main() {
	Maze a;
	cout << "传一个迷宫m*n" << endl;
	int m, n;
	int x, y;
	cin >> m >> n;
	cout << "输入数字矩阵迷宫,0是入口,1是路,2是墙,3是出口" << endl;
	vector<vector<int>> ret(m, vector<int>(n));
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			cin >> ret[i][j];
			if (ret[i][j] == 0) {
				x = i;
				y = j;
			}
		}
	}
	vector<string> ans = a.test(ret, x, y);
	m = ans.size();
	string kk[100];
	for (int i = 0; i < m; i++) {
		kk[i] = ans[i];
	}
	sort(kk, kk + m, compare);//排序
	cout << "最短的路是:" << kk[0] << endl;
	for (int i = 1; i < m; i++) {
		cout << kk[i] << endl;
	}
	return 0;
}

假设输入:4 4
1 0 1 3
1 2 2 1
1 2 2 1
1 1 1 1

得到的结果如图:

以上就是本文的所有内容,如果有帮助就点一个赞吧。

标签:false,nums,back,dfs,vector,C++,回溯,path,check
From: https://blog.csdn.net/chen0708chen/article/details/141994686

相关文章

  • 【C++】模板初阶
    【C++】模板初阶1.函数模板(1).函数模板概念(2).函数模板格式(3).函数模板的原理(4).函数模板的实例化2.类模板(1).类模板的定义格式(2).类模板的实例化1.函数模板(1).函数模板概念函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据......
  • C++(clock())
    目录1.clock_t2.clock()2.1函数定义3.示例4.注意事项在C++中,clock_t和clock()是与时间度量和性能测量相关的库函数,主要用于计算程序运行的时间。1.clock_tclock_t是在<ctime>或<time.h>中定义的一个类型,通常用于存储由clock()返回的处理器时间值。这个类型......
  • C++(std::vector)
    目录1.特性2.常用成员函数2.1构造函数2.2元素访问2.3修改容器2.4容量相关2.5迭代器3.内存管理与效率4.示例:5.性能分析:std::vector是C++标准库中的一个动态数组容器,位于#include<vector>头文件中。它是一个模板类,可以存储任何类型的对象,并根据需要动态调整其大......
  • C++顺序结构(1)
    1、C++程序的样子2、流输出流COUT<<3、一个实例及解析//001程序的基本结构 //单行注释/*多行注释 被注释过的内容不会被运行,可以用来做笔记。基本结构:1.头文件 程序包含某个头文件后,程序中的代码就可以使用这个头文件里的功能。2.命名空间3.主函数 类似Scr......
  • C++:构造函数、析构函数
    目录一、类的默认成员函数二、构造函数构造函数的特点三、析构函数析构函数的特点一、类的默认成员函数    默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数,一个类,我们不写的情况下编译器会默认生成以下6个默认成员函数,默认成员函......
  • 南沙信C++陈老师解一本通题: 1101:不定方程求解
    ​ 【题目描述】给定正整数a,b,c。求不定方程 ax+by=c关于未知数x和y的所有非负整数解组数。【输入】一行,包含三个正整数a,b,c两个整数之间用单个空格隔开。每个数均不大于1000。【输出】一个整数,即不定方程的非负整数解组数。【输入样例】2318【输出样例】4......
  • C++ string类详解
    文章目录C++|string类详解1、标准库中的string类1.1string类介绍1.2auto关键字和范围for读写string1.2.1auto关键字1.2.2范围for组成内容:特点:举例:1.3string类的常用接口说明1.3.1常见构造方式1.3.2常见容量相关操作1.3.3string类对象的访问及遍历操作1.3.4stri......
  • C++vector类相关OJ练习
    个人主页:C++忠实粉丝欢迎点赞......
  • windows C++ 并行编程-转换使用取消的 OpenMP 循环以使用并发运行时
    某些并行循环不需要执行所有迭代。例如,搜索值的算法可以在找到值后终止。OpenMP不提供中断并行循环的机制。但是,可以使用布尔值或标志来启用循环迭代,以指示已找到解决方案。并发运行时提供允许一个任务取消其他尚未启动的任务的功能。此示例演示如何将一个不需要运行所有......
  • windows C++ 并行编程-使用 加速器 对象(下)
    并发运行时支持各种编程模型。这些模型可能会与其他库的模型重叠或对其进行补充。本部分中的文档将OpenMP与并发运行时进行比较,并提供有关如何迁移现有OpenMP代码以使用并发运行时的示例。OpenMP编程模型由开放标准定义,具有与Fortran和C/C++编程语言定义完善的绑定......