P1379 八数码难题

题目描述

在 3×3 的棋盘上,摆有八个棋子,每个棋子上标有 1 至 8 的某一数字。棋盘中留有一个空格,空格用 0 来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为 123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。

输入格式

输入初始状态,一行九个数字,空格用 0 表示。

输出格式

只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数。保证测试数据中无特殊无法到达目标状态数据。

输入输出样例

输入 #1复制

283104765

输出 #1复制

4

说明/提示

样例解释

图中标有 0 的是空格。绿色格子是空格所在位置,橙色格子是下一步可以移动到空格的位置。如图所示,用四步可以达到目标状态。

并且可以证明,不存在更优的策略。

解析:

1.最短步骤想到使用bfs,用string来记录当前的状态,遍历状态。

注意:string 下角标是从0开始的,x = dx/3 , y = dy%3; 为真实九宫格的坐标。九宫格坐标是从(0,0)开始的。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<unordered_map>
using namespace std;
unordered_map<string,int> d;
queue<string> q;
int dx[4] ={-1,0,1,0};
int dy[4] = {0,1,0,-1};

int bfs(string str)
{
	q.push(str);
	string end="123804765";
	while(q.size())
	{
		string s = q.front();
		q.pop();
		if(s==end) return d[s];
		int k = s.find('0');
		int x = k/3,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) continue;
			int dis = d[s];
			swap(s[k],s[a*3 + b]);
			if(!d.count(s))//交换 
				d[s] = dis+1,q.push(s);
			swap(s[k],s[a*3+b]);//还原			
		}
	}	
} 
int main()
{
	string s;
	cin >> s;
	cout << bfs(s)<<endl;	
	return 0;
}

时间复杂度为:O(9^{2})

使用A*算法进行优化。

A算法给出了评价函数的定义: f(n) = g(n) + h(n)
其中,n为待评价的节点;g(n)为从初始节点s到节点n的最佳路径耗散值的估计值;h(n)为从节点n到目标节点t的最佳路径耗散值的估计值,称为启发函数;f(n)为从初始节点s经过节点n到达目标节点的最佳路径耗散值的估计值,成为评价函数,我们每次从叶节点选出f(n)最小的节点扩展。
 

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<unordered_map>
#include<bits/stdc++.h>
using namespace std;
unordered_map<string,int> d;
string goal = "123804765";
int gx[] = {-1,0,0,0,1,2,2,2,1};
int gy[] = {-1,0,1,2,2,2,1,0,0};
int dx[4] ={-1,0,1,0};
int dy[4] = {0,1,0,-1};
int f(string s)
{ // 每个数字到目的地的坐标 
	int res = 0;
	for(int i = 0;i < 9;i++)
	{
		int t = s[i]-'0';
		if(t) res+= abs(i/3 - gx[t]) + abs(i%3-gy[t]);
	}
	return res;
}
int bfs(string str)
{
	unordered_map<string,int> d;
	priority_queue<pair<int,string>> q;//默认大根堆 ,我们只需要取负数,小的数就会在上面 
	q.push({-f(str),str});
	d[str] = 0;
	while(q.size())
	{
		auto a = q.top();
		q.pop();
		string s = a.second;
		if(s== goal) return d[s]; // d 记录现实的 状态 f为理想状态下 曼哈顿距离 
		int k = s.find('0');
		int x = k /3,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) continue;
			string t = s;
			swap(t[k],t[a*3+b]);
			if(!d.count(t))
			{
				d[t] = d[s]+1,q.push({-(d[t] + f(t)),t});
			}
		}
	}
} 
int main()
{
	string s;
	cin >> s;
	cout << bfs(s)<<endl;	
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/316993.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux centos stream9 parted

在Linux中&#xff0c;常用的磁盘管理工具包括 fdisk、parted、gdisk 等。它们可以用于创建、删除、调整分区、查看分区表等操作。 传统的MBR分区表(即主引导记录)大家都很熟悉&#xff0c;是过去我们使用windows时常见的。所支持的最大卷2T&#xff0c;且对分区有限制&#x…

SRM供应商招标采购管理系统(源码)

软件相关资料获取&#xff1a;点我获取 一、SRM供应商在线采购 SRM供应商在线采购是指企业通过互联网平台&#xff0c;实现对供应商的在线招募、选择、关系管理等一系列活动。这种采购方式具有高效、透明、便于管理的特点&#xff0c;能够帮助企业降低采购成本&#xff0c;提…

Vue中v-if与v-show区别详解

✨ 专栏介绍 在当今Web开发领域中&#xff0c;构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架&#xff0c;正是为了满足这些需求而诞生。它采用了MVVM架构模式&#xff0c;并通过数据驱动和组件化的方式&#xff0c;使…

Nightingale 夜莺监控系统 - 告警篇(3)

Author&#xff1a;rab 官方文档&#xff1a;https://flashcat.cloud/docs/content/flashcat-monitor/nightingale-v6/usage/alert/alert-rule/ 目录 前言一、配置1.1 创建钉钉机器人1.2 n9e 创建通知用户1.3 n9e 创建团队&#xff08;组&#xff09;1.4 将通知用户添加团队1.…

C++核心编程——文件操作

本专栏记录C学习过程包括C基础以及数据结构和算法&#xff0c;其中第一部分计划时间一个月&#xff0c;主要跟着黑马视频教程&#xff0c;学习路线如下&#xff0c;不定时更新&#xff0c;欢迎关注。 当前章节处于&#xff1a; ---------第1阶段-C基础入门 ---------第2阶段实战…

Realm Management Extension领域管理扩展(下)

四、颗粒保护检查 本节描述了RME引入的颗粒保护检查。颗粒保护检查使得能够在不同的物理地址空间之间动态分配内存区域。 本节将向您介绍以下功能: 颗粒保护表的结构用于颗粒保护检查的故障报告区域在物理地址空间之间的过渡正如在物理地址一节中所述,RME提供了四个物理地址…

gitee完整使用教程,创建项目并上传

目录 一 什么是gitee 二 安装Git 三 登录gitee&#xff0c;生成密钥 四 配置SSH密钥 五 创建项目 六 克隆仓库到本地 七 关联本地工程到远程仓库 八 添加文件 九 异常处理 十 删除仓储 十一 git常用命令 一 什么是gitee gitee是开源中国推出的基于git的代码托管服务…

.Net Core项目在linux部署实战 1.sdk下载 2.环境变量配置 3.运行

1)下载.net core sdk https://download.visualstudio.microsoft.com/download/pr/01292c7c-a1ec-4957-90fc-3f6a2a1e5edc/025e84c4d9bd4aeb003d4f07b42e9159/dotnet-sdk-6.0.418-linux-x64.tar.gz 2)配置下环境变量 step1: // 解压到指定目录 mkdir -p $HOME/dotnet &…

缓解大语言模型(LLM)幻觉的可行方法探究(课程综述)

缓解大语言模型&#xff08;LLM&#xff09;幻觉的可行方法探究 转载请标明出处&#xff0c;&#x1f232;抄袭 摘要&#xff1a;2022年11月OpenAI推出能够进行多场景对话的大语言模型ChatGPT&#xff0c;ChatGPT凭借大规模的训练参数、海量的训练数据及强化学习人类反馈在语…

亚马逊新店成长手册:从起步到壮大,每一步都有策略(测评)

在亚马逊的浩瀚海洋中&#xff0c;每天都有无数商家乘风破浪&#xff0c;争先恐后地开设自己的新店铺。如何在波涛汹涌的市场中独树一帜&#xff0c;成功地将产品送达顾客手中&#xff1f;接下来将为你揭晓这个秘密。首先&#xff0c;要确定产品方向。这需要深入了解你的目标受…

高级分布式系统-第7讲 分布式系统的时钟同步

顺序的分类 在分布式系统中&#xff0c; 顺序关系主要分为以下三类&#xff1a;时间顺序&#xff1a; 事件在时间轴上发生的先后关系。 无限时刻集组成有向时间轴&#xff0c; 时间顺序是通过时刻的顺序体现的。 因果顺序&#xff1a; 如果事件e1是事件e2发生的原因&#xf…

抖店怎么做的?开店带货流程+运营基础问题解答,感兴趣可收藏!

我是王路飞。 抖店具体是怎么做的呢&#xff1f; 像有些人在抖音既没有粉丝基础、也没有拍短视频和开直播的能力&#xff0c;适合做抖店吗&#xff1f; 先说明&#xff0c;抖店可以0粉丝开通&#xff0c;店铺运营和出单也跟这些没关系&#xff0c;所以你们可以放心去做。 这…

Web前端-移动web开发_流式布局

文章目录 移动web开发流式布局1.0 移动端基础1.1浏览器现状1.2 手机屏幕的现状1.3常见移动端屏幕尺寸1.4移动端调试方法 2.0 视口2.1 布局视口 layout viewport2.2视觉视口 visual viewport2.3理想视口 ideal viewport&#xff08;苹果&#xff09;2.4meta标签 3.0 物理像素(手…

Linux高性能服务器编程——学习笔记①

第一章、tcp/ip协议族 一、tcp/ip协议族1.1 主要的协议1.1.1 数据链路层1.1.2 网络层1.1.3 传输层1.1.4 应用层 1.2 封装1.3 分用1.4 测试网络1.5 ARP协议工作原理1.5.1 以太网ARP请求/应答报文详解1.5.2 ARP高速缓存的查看和修改1.5.3 使用tcpdump观察ARP通信过程 1.6 DNS工作…

LTD259次升级 | 新增发票管理 • 官网与名片线索管理多维度 • 公海线索客户轨迹更周全

1、 商城会员中心新增申请发票&#xff1b; 2、 商城管理新增发票审核与开票管理功能&#xff1b; 3、 官网客户、名片客户、线索公海新增筛选、跟进、分配功能&#xff1b; 4、 其他已知问题修复与优化&#xff1b; 01 商城 在本次升级中&#xff0c;我们为商城新增了发票管理…

无需任何三方库,在 Next.js 项目在线预览 PDF 文件

前言&#xff1a; 之前在使用Vue和其它框架的时候&#xff0c;预览 PDF 都是使用的 PDFObject 这个库&#xff0c;步骤是&#xff1a;下载依赖&#xff0c;然后手动封装一个 PDF 预览组件&#xff0c;这个组件接收本地或在线的pdf地址&#xff0c;然后在页面中使用组件的车时候…

筛选数据-第15届蓝桥第三次STEMA测评Scratch真题精选

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第164讲。 第15届蓝桥杯第3次STEMA测评已于2023年12月17日落下帷幕&#xff0c;编程题一共有6题&#xff0c;分别如下&…

Java判断字符串当中是否有中文符号(不是中文名称,是符号)

public static void main(String[] args) throws ParseException, IOException, URISyntaxException {// 测试示例String testString1 "Hello,test&#xff01;";String testString2 "This is a test.";boolean result1 containsChineseSymbols(testStr…

别再为创业失败找借口了!否则你永远无法创业成功!2024适合上班族的创业,2024个人创业做什么

每当聊起创业&#xff0c;很多人嘴上都很积极&#xff0c;行动都很低迷&#xff0c;事后就开始找各种理由开始否定创业这个路&#xff0c;要么就是大环境不好&#xff0c;要么就是行业太差&#xff0c;还有就是竞争太多&#xff0c;反正不会是自己的能力太差。 其实创业没有你想…