IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> AcWing 845 八数码 题解(BFS) -> 正文阅读

[数据结构与算法]AcWing 845 八数码 题解(BFS)

题很巧妙,之前我还真不知道可以把矩阵问题换算到队列,用一维数组、队列解决(可能因为我太菜了),这个题的思路是真的巧妙
原题链接:https://www.acwing.com/problem/content/847/
解题思路:把不同的矩阵状态转化为一维字符串表示,从第一个初始矩阵开始,把每个可以达到的矩阵状态存入队列,挨个将队首元素出队,判断这个矩阵能达到的状态,将可以达到的状态入队,直到达到最终状态

#include<iostream>
#include<cstring>
#include<algorithm>
#include<unordered_map>//存字符串和距离的映射关系
#include<queue>//用队列存每个状态 

using namespace std;

int bfs(string start){
	
	string end = "12345678x";//标记最终想要达到的状态 
	unordered_map<string, int>d;
	queue<string>q;//字符串队列,储存每个矩阵状态 
	
	q.push(start);//将初始矩阵入队 
	//移动数组 
	int dx[4] = {0, 0, 1, -1}; 
	int dy[4] = {1, -1, 0, 0};
	
	while(q.size()){//当数组不空时 
		auto t = q.front();//队首元素出队 
		q.pop();
		
		if(t == end) return d[t];//如果此时队首元素已经达到end状态 
		
		int dis = d[t];//记录这个队首元素的步数值 
		int k = t.find('x');//找到一维数组中x的位置 
		int x = k % 3;//一维数组下标 %3是x点在矩阵中的横坐标 
		int y = k / 3;//一维数组的下标/3是x点在矩阵中的纵坐标 
		
		for(int i = 0; i < 4; i ++ ){//遍历x点要去的位置 
			int x1 = x + dx[i];
			int y1 = y + dy[i];
			
			if(x1 >= 0 && x1 < 3 && y1 >= 0 && y1 < 3){//如果x点可以到达这个位置 
				swap(t[k], t[y1 * 3 + x1]);//交换x点和目标位置 
				if(!d.count(t)){//如果交换后的矩阵没有出现过 
					d[t] = dis + 1;//交换后的矩阵对应的步数+1 
					q.push(t);//将交换后的矩阵入队 
				}
				swap(t[k], t[y1 * 3 + x1]);//判断这个状态入队之后恢复矩阵,因为要进行四次循环判断四个位置 
			}
		}
	}
	return -1;//如果一直没有找到合适的位置,就输出-1 
}

int main()
{
	string start;
	for(int i = 0; i < 9; i ++ ){
		char c;
		cin>>c;
		start += c;
	}
	cout<<bfs(start)<<endl; 
	return 0;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-04 17:47:48  更:2021-09-04 17:50:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:59:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码