八数码(BFS + 队列 + 哈希表)

news/2024/6/29 11:48:56 标签: 宽度优先, 散列表, 算法

 

这题虽然比较难,但仍然遵循BFS的思路图片引自我的上一篇文章:

走迷宫(BFS + 队列)-CSDN博客

难点

(1)如何将一个二维数组表示的状态记录下来,并且需要便于知道某个状态是否访问过

(2)部分版本的devC++下,unordered_map 头文件没法直接 include 到文件里

解决方法

(1)将二维的数组表示成一个一维数组(一维数组和二维数组的坐标可以相互转换,具体请看代码),用 string 来存储,然后利用哈希表 unordered_map,对应每个 string 有一个 int 值,表示某个状态距离起始状态的步数;利用 unordered_map 的函数 count (s),可以计算出 s 在表中出现的次数,如果不为 0 ,则说明这种状态已经出现过。

(2)改成 #include<tr1/unordered_map> 

                using namespace std :: tr1;

#include<iostream>
#include<queue>
using namespace std;

#include<tr1/unordered_map>
using namespace std::tr1;

queue<string> q;
unordered_map<string, int> dist; 

int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};

int bfs(string s)
{
	string end = "12345678x"; // 终止条件 
	
	q.push(s); // 队列初始化 
	dist[s] = 0;
	
	while(!q.empty())
	{
		string now = q.front();
		int step = dist[now];
		
		if(now == end) return step;
		
		int k = now.find('x');
		// 由一维数组的坐标得到二维数组的坐标 x,y 
		int x = k / 3;
		int y = k % 3;
		
		for(int i=0;i<4;++i)
		{
			int a = x + dx[i], b = y + dy[i];
			// 在二维下判断有无越界
			if(a >= 0 && a < 3 && b >= 0 && b < 3)
			{
				//  由二维数组的坐标得到一维数组的坐标 k2
				int k2 = 3 * a + b;
				// swap还能用于string里两个字母的交换
				swap(now[k], now[k2]);  
				if(!dist.count(now))
				{
					dist[now] = step + 1;
					q.push(now);
				}
				// 记得将字符串复原,防止dist误认为没有访问过 
				swap(now[k], now[k2]);
			}
		}
		
		q.pop(); // 四种情况走完,弹出队首 
	}
	return -1; 
}

int main()
{
	string s;
	for(int i=0;i<9;++i)
	{
		char c;
		cin>>c;
		s += c;
	}
	
	cout<<bfs(s);
	
	return 0;
}


http://www.niftyadmin.cn/n/5344723.html

相关文章

IDEA插件(MyBatis Log Free)

引言 在Java开发中&#xff0c;MyBatis 是一款广泛使用的持久层框架&#xff0c;它简化了SQL映射并提供了强大的数据访问能力。为了更好地调试和优化MyBatis应用中的SQL语句执行&#xff0c;一款名为 MyBatis Log Free 的 IntelliJ IDEA 插件应运而生。这款插件旨在帮助开发者…

[BJDCTF2020]ZJCTF,不过如此(特详解)

php特性 1.先看代码&#xff0c;提示了next.php&#xff0c;绕过题目的要求去回显next.php 2.可以看到要求存在text内容而且text内容强等于后面的字符串&#xff0c;而且先通过这个if才能执行下面的file参数。 3.看到用的是file_get_contents()函数打开text。想到用data://协…

重构改善既有代码的设计-学习(四):简化条件逻辑

1、分解条件表达式&#xff08;Decompose Conditional&#xff09; 可以将大块代码分解为多个独立的函数&#xff0c;根据每个小块代码的用途&#xff0c;为分解而得的新函数命名。对于条件逻辑&#xff0c;将每个分支条件分解成新函数还可以带来更多好处&#xff1a;可以突出条…

[极客大挑战 2019]BabySQL1

发现union select被过滤了&#xff0c;双写绕过 or、from被过滤 where被过滤 在b4bysql中找到flag

【高效开发工具系列】Intellj IDEA 2023.3 版本

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

安卓移动设备使用DS file文件管理工具远程访问本地群晖NAS文件

文章目录 1. 群晖安装Cpolar2. 创建TCP公网地址3. 远程访问群晖文件4. 固定TCP公网地址5. 固定TCP地址连接6. 结语 DS file 是一个由群晖公司开发的文件管理应用程序&#xff0c;主要用于浏览、访问和管理存储在群晖NAS&#xff08;网络附加存储&#xff09;中的文件。这个应用…

CentOS 7安装Mysql+Mycat

安装MySQL yum源 yum localinstall http://repo.mysql.com//mysql57-community-release-el7-7.noarch.rpm修改源 vi /etc/yum.repos.d/mysql-community.repo [mysql-connectors-community] nameMySQL Connectors Community baseurlhttp://repo.mysql.com/yum/mysql-connectors…

腾讯云OpenCloudOS安装ES(elasticsearch7.17.16)

腾讯云OpenCloudOS安装ES&#xff08;elasticsearch7.17.16&#xff09; 下载ES 先从官网下载es的Linux解压包官网地址 https://www.elastic.co/cn/downloads/past-releases/elasticsearch-7-17-16 下载完成后&#xff0c;将其放置在自己想要放到的路径下 配置ES 解压文件 …