【HDU No. 3567】八数码 II Eight II

news2025/7/11 9:58:18

【HDU No. 3567】八数码 II Eight II

杭电OJ 题目地址

在这里插入图片描述

【题意】

八数码,也叫作“九宫格”,来自一个古老的游戏。在这个游戏中,你将得到一个3×3的棋盘和8个方块。方块的编号为1~8,其中一块方块丢失,称之为“X”。“X”可与相邻的方块交换位置。用符号“r”表示将“X”与其右侧的方块进行交换,用“l”表示左侧的方块,用“u”表示其上方的方块,用“d”表示其下方的方块。

在这里插入图片描述

棋盘的状态可以用字符串S表示,使用下面显示的规则。

在这里插入图片描述

问题是使用“r”“u”“l”“d”操作列表可以将棋盘的状态从状态A转到状态B,需要找到满足以下约束的结果:

  1. 在所有可能的解决方案中,它的长度最小;
  2. 它是所有最小长度解中词典序最小的一个。

【输入输出】

输入:

第1行是T (T ≤200),表示测试用例数。每个测试用例的输入都由两行组成,状态A位于第1行,状态B位于第2行。保证从状态A到状态B都有有效的解决方案。

输出:

对于每个测试用例,都输出两行。第1行是“Case x :d”格式,其中x 是从1开始计算的案例号,d 是将A转换到B的操作列表的最小长度。第2行是满足约束条件的操作列表。

在这里插入图片描述

【思路分析】

本题为八数码问题,与前面八数码问题(HDU1043)不同的是,本题的终态(目标状态)不是固定不变的,而是由输入确定的。要求从初A到终态B,输出最少的步数和操作序列,而且如果最小步数相同,则输出字典序最小的一个。本题保证有解,无须可解性判断,可以采用A*、IDA算法解决,在此采用IDA算法。

【算法设计】

[1] 读入初态,用变量x 记录“X”出现的位置i ,令a [i ]=0,将其他位置减去“0”转换成数字。例如,初态为564178X23,用变量x记录“X”出现的位置6,转换之后的棋盘如下图所示。

在这里插入图片描述

[2] 读入终态,“X”出现的位置为i ,令goal[i ]=0,其他位置减去“0”转换成数字。上题(HDU1043)中目标状态数字正好等于位置下标,本题中的目标状态是根据输入数据确定的,为了方便计算启发函数,对目标状态建立一个从数字到位置下标的映射。将goal[i ]映射到位置下标i ,m [goal[i ]]=i 。

例如,终态为7568X4123,转换之后的棋盘如下图所示,m[7]=0,m [6]=2。

在这里插入图片描述

[3] 计算初态启发函数并初始化深度depth=h()。如下图所示,初始状态中数字7的位置下标为4,转换为4/3行、4%3列,即1行、1列。目标状态中数字7的映射位置下标为0,转换为0/3行、0%3列,即0行、0列。两个位置的曼哈顿距离为|1-0|+|1-0|=2。除了0(X滑块),计算当前状态和目标状态中每个位置的曼哈顿距离之和。

在这里插入图片描述

[4] 深度优先搜索,计算当前状态的启发函数h (),如果正好为0,则找到目标输入答案,返回1。如果d +t >depth,则更新mindep=min(mindep, d +t ),返回0。

[5] 沿着4个方向搜索,如果x 的新位置未出边界、不是前一个位置,则交换原位置和新位置,记录操作序列,从新位置开始深度加1,进行深度优先搜索,如果找到答案,则返回1,否则交换原位置和新位置,还原现场并回溯。

[6] 如果未找到答案,则深度为depth=mindep,继续进行迭代加深搜索。

【算法实现】

定义方向数组及操作序列,操作序列字母按字典序排序。

#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
const int dir[4][2]={{1,0},{0,-1},{0,1},{-1,0}};
const char str[]={'d','l','r','u'};//保证字母序
int a[9],goal[9],m[9];
int depth,mindep;
char ans[1000005];

int h(){//启发函数,曼哈顿距离(行列差绝对值之和) 
	int cost=0;
	for(int i=0;i<9;i++){
		if(a[i])
			cost+=abs(i/3-m[a[i]]/3)+abs(i%3-m[a[i]]%3);
	}
	return cost;
}

bool dfs(int x,int d,int pre){
	int t=h();
	if(!t){
		printf("%d\n",d);
		ans[d]='\0';
		printf("%s\n",ans);
		return 1;
	}
	if(d+t>depth){
		mindep=min(mindep,d+t);
		return 0;
	}
	for(int i=0;i<4;i++){
		int row=x/3+dir[i][0];
		int col=x%3+dir[i][1];
		int newx=row*3+col;//转换为数字 
		if(row<0||row>2||col<0||col>2||newx==pre) continue;
		swap(a[newx],a[x]);
		ans[d]=str[i];
		if(dfs(newx,d+1,x)) return 1;
		swap(a[newx],a[x]);
	}
	return 0;
}

void IDAstar(int x){
	depth=h();
	while(1){
		mindep=inf;
		if(dfs(x,0,-1))
			break;
		depth=mindep;
	}
}

int main(){
	int T,x,cas=0;
	scanf("%d",&T);
	while(T--){
		scanf("%s",ans);
		for(int i=0;i<9;i++){
			if(ans[i]=='X')//大写X
				x=i,a[i]=0;
			else
				a[i]=ans[i]-'0';
		}
		scanf("%s",ans);
		for(int i=0;i<9;i++){
			if(ans[i]=='X')
				goal[i]=0;
			else
				goal[i]=ans[i]-'0';
			m[goal[i]]=i;//映射位置
		}
		printf("Case %d: ",++cas);
		IDAstar(x);
	}
	return 0;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【python】基础复习

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录python的应用基础语法编码标识符python保留字第一个注释多行语句数字(Number)类型字符串(String)print 默认输出是换行的&#xff0c;如果要实现不换行需要在变量末尾加上 end""&#xff1a;impor…

猿创征文|在校大学生学习UI设计必备工具及日常生活中使用的软件

嗨&#xff0c;大家好&#xff0c;我是异星球的小怪同志 一个想法有点乱七八糟的小怪 如果觉得对你有帮助&#xff0c;请支持一波。 希望未来可以一起学习交流。 我是一名在校大二的学生&#xff0c;目前在学习关于UI设计方向的一些课程&#xff0c;平时会用到UI设计必备的工…

我终于读懂了适配器模式。。。

文章目录&#x1f5fe;&#x1f306;什么是适配器模式&#xff1f;&#x1f3ef;类适配器模式&#x1f3f0;对象适配器模式⛺️接口适配器模式&#x1f3ed;适配器模式在SpringMVC 框架应用的源码剖析&#x1f5fc;适配器模式的注意事项和细节&#x1f306;什么是适配器模式&am…

基于SDN环境下的DDoS异常攻击的检测与缓解--实验

基于SDN环境下的DDoS异常攻击的检测与缓解--实验基于SDN环境下的DDoS异常攻击的检测与缓解--实验1.安装floodlight2.安装sFlow-RT流量监控设备3.命令行安装curl工具4.构建拓扑5.DDoS 攻击检测6.DDoS 攻击防御7.总结申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&am…

PNG怎么转换成PDF?这篇文章教会你

有时候我们需要查找一些图片资料并将它打印出来&#xff0c;但是在网上的图片大多是以PNG格式存在的&#xff0c;这个时候&#xff0c;我们就需要先利用一些转换软件把PNG转换成PDF文件的格式&#xff0c;从而方便我们进行打印。那么你们知道PNG转PDF怎么转换吗&#xff1f;今天…

第四章:前缀和、差分(数列)

前缀和差分一、前缀和1、 什么是前缀和2、 前缀和的作用3、 前缀和的例题和模板&#xff08;1&#xff09;一维数组的前缀和C版C版&#xff08;2&#xff09;二维数组的前缀和a.思路&#xff1a;b.题目和模板&#xff1a;C版C版二、差分1、什么是差分&#xff1f;2、差分有什么…

FFplay文档解读-43-视频过滤器十八

29.170 telecine 将电视电影处理应用于视频。 此过滤器接受以下选项&#xff1a; first_field选项解释top, ttop field firstbottom, b底部字段优先默认值为top pattern一串数字&#xff0c;表示希望应用的下拉模式。 默认值为23。 Some typical patterns:NTSC output (30i…

传统纸业如何实现数字化,S2B2C系统网站赋能渠道提升供应链管理效率

一千多年前&#xff0c;我们老祖宗发明了造纸术&#xff0c;纸张成为方便、廉价的信息载体&#xff0c;由此影响了中国乃至世界文明的进程。如今&#xff0c;随着信息技术的普及&#xff0c;纸张作为信息载体的功能日益弱化&#xff0c;但作为一种环保材料将会更广泛地融入我们…

通过宠物商店理解java面向对象

前言&#xff1a;本篇博客&#xff0c;适合刚刚学完java基础语法的但是&#xff0c;对于面向对象&#xff0c;理解不够深刻的读者&#xff0c;本文通过经典的宠物商店&#xff0c;来让读者深刻的理解&#xff0c;面向对象&#xff0c;IS-A&#xff0c;HAS-A法则。本文不仅仅是简…

Spring更简单保存和获取bean对象的方法(注解)

Spring更简单保存和获取bean对象的方法前置准备将bean对象更为简单地保存到Spring容器中&#xff08;使用注解&#xff09;【使用类注解】 (是写在类前的)为什么要这么多类注解&#xff1f;类注解之间的关系使用类注解 Bean 命名规则使用方法注解&#xff08;Bean&#xff09;不…

[MySQL]数据库的约束与表的设计

专栏简介 :MySql数据库从入门到进阶. 题目来源:leetcode,牛客,剑指offer. 创作目标:记录学习MySql学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 文章目录 1.数据库约束 1.1 约束类型 1.2 null 约束 1.…

Redis面试题

目录 面试题&#xff1a;谈谈你对Redis的理解&#xff1f; 面试题&#xff1a;Redis的基本数据类型 Redis的基本数据类型以及它们的应用场景&#xff1a; 面试题&#xff1a;redis内存淘汰机制 面试题&#xff1a;Redis持久化机制 RDB AOF 面试题&#xff1a;Redis写时复…

相似度系列-3:传统方法ROUGE ROUGE: A Package for Automatic Evaluation of Summaries

文章目录ROUGE: A Package for Automatic Evaluation of Summariesintroduction基础模型Rouge-NRouge_NmultiROUGE-L: Longest Common Subs equence1**Sentence-level LCS**2**Summary-Level LCS**ROUGE-W: Weighted Longest Common SubsequenceROUGE-S: Skip-Bigram Co-Occurr…

Python小总结

Python小总结一、open&#xff08;一&#xff09;open的定义&#xff1a;open是Python的内置函数&#xff0c;一般用于本地文件的读写操作。&#xff08;二&#xff09;open例子&#xff1a;二、with open&#xff08;一&#xff09;用途&#xff1a;with open是Python用来打开…

04 数学软件与建模---最优化模型

一、优化模型的数学描述 二、优化模型的分类 1.根据是否存在约束条件 有约束问题和无约束问题。 2.根据设计变量的性质 静态问题和动态问题。 3.根据目标函数和约束条件表达式的性质 线性规划&#xff0c;非线性规划&#xff0c;二…

PiL测试实战(上)| 模型生成代码的单元级PiL测试

前言 对于嵌入式代码&#xff0c;为了测试软件能否在目标芯片上实现预期的功能&#xff0c;通常需要进行PiL测试&#xff08;Processor-in-the-Loop-Testing&#xff09;。 目前市面上较为常见的嵌入式软件调试工具有PLS UDE和LAUTERBACH Trace32等。UDE和Trace32可以很好的完…

通俗易懂话GC-C#的内存管理

昨天和一个朋友聊到图像处理软件内存占用多的问题&#xff0c;然后很自然聊到了GC&#xff0c;回想起以往很初学者都问到类似的问题&#xff1a; 1、C#自己就会垃圾回收&#xff0c;为什么我还要关心垃圾回收&#xff1f; 2、GC可以回收垃圾&#xff0c;但回收的时候又会让线…

js深浅拷贝:保证赋值后改变第二个变量的值,不影响第一个变量的值

对于基本数据来说&#xff0c;将一个变量赋值给另一个变量&#xff0c;第二个变量值改变了&#xff0c;不会影响第一个变量&#xff1b;但对于复杂类型中的对象来讲&#xff0c;将一个对象赋值给另外一个对象&#xff0c;其实是将放对象内容的地址赋值给了第二个对象&#xff0…

Amazon EKS绑定alb 使用aws-load-balancer-controller(Ingress Controller)对外提供服务

1、创建AWS Load Balancer Controller 的 IAM 策略 亚马逊相关文档 下载地址 打开 策略 点击 创建策略 打开 IAM_Policy.json 复制内容粘贴到 json 点击下一步:标签 然后一直下一步 在下图中名称填写 AWSLoadBalancerControllerIAMPolicy 你也可以自定义名称。然后创建策略。…

尚医通_第11章_医院排班管理和搭建用户系统环境

尚医通_第11章_医院排班管理和搭建用户系统环境 文章目录尚医通_第11章_医院排班管理和搭建用户系统环境第一节、-医院排班管理需求分析一、医院排班管理需求1、页面效果2、接口分析第二节、医院排班管理-科室列表一、科室列表&#xff08;接口&#xff09;1、添加service接口和…