AcWing 回转游戏 dfs IDA* 剪枝 统一操作 java

news2024/10/6 12:28:45

🍑 算法题解专栏


🍑 回转游戏

如下图所示,有一个 # 形的棋盘,上面有 1 , 2 , 3 1,2,3 1,2,3 三种数字各 8 8 8 个。

给定 8 8 8 种操作,分别为图中的 A s i m H A \\sim H AsimH

这些操作会按照图中字母和箭头所指明的方向,把一条长为 7 7 7 的序列循环移动 1 1 1 个单位。

例如下图最左边的 # 形棋盘执行操作 A A A 后,会变为下图中间的 # 形棋盘,再执行操作 C C C 后会变成下图最右边的 # 形棋盘。

给定一个初始状态,请使用最少的操作次数,使 # 形棋盘最中间的 8 8 8 个格子里的数字相同。

在这里插入图片描述

输入格式

输入包含多组测试用例。

每个测试用例占一行,包含 24 24 24 个数字,表示将初始棋盘中的每一个位置的数字,按整体从上到下,同行从左到右的顺序依次列出。

输入样例中的第一个测试用例,对应上图最左边棋盘的初始状态。

当输入只包含一个 0 0 0 的行时,表示输入终止。

输出格式

每个测试用例输出占两行。

第一行包含所有移动步骤,每步移动用大写字母 A s i m H A \\sim H AsimH 中的一个表示,字母之间没有空格,如果不需要移动则输出 No moves needed

第二行包含一个整数,表示移动完成后,中间 8 8 8 个格子里的数字。

如果有多种方案,则输出字典序最小的解决方案。

输入样例:

1 1 1 1 3 2 3 2 3 1 3 2 2 3 1 2 2 2 3 1 2 1 3 3
1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3
0

输出样例:

AC
2
DDHH
2

在这里插入图片描述

import java.util.Scanner;

/*
      0     1
      2     3
4  5  6  7  8  9 10
      11    12
13 14 15 16 17 18 19
      20    21
      22    23
 */

public class Main
{
	static int N = 24;
	static int[] a = new int[N];
	static int[] path = new int[1000];
//	8个操作对应的 a 数组的下标值
	static int[][] op = { { 0, 2, 6, 11, 15, 20, 22 }, { 1, 3, 8, 12, 17, 21, 23 }, { 10, 9, 8, 7, 6, 5, 4 },
			{ 19, 18, 17, 16, 15, 14, 13 }, { 23, 21, 17, 12, 8, 3, 1 }, { 22, 20, 15, 11, 6, 2, 0 },
			{ 13, 14, 15, 16, 17, 18, 19 }, { 4, 5, 6, 7, 8, 9, 10 } };

//	中心的八个数对应的下标值
	static int[] center = { 6, 7, 8, 11, 12, 15, 16, 17 };
	static int[] opposite = { 5, 4, 7, 6, 1, 0, 3, 2 };// 记录操作 i 的相反操作

	static boolean check()
	{
		for (int i = 0; i < 7; i++)
			if (a[center[i]] != a[center[i + 1]])
				return false;
		return true;
	}

//	估价函数:每次移动顶多增加一个相同值,8 - 最大重复值个数 = 最优预估步数
	static int f()
	{
		int[] cnt = new int[4];
		for (int i = 0; i < 8; i++)
			cnt[a[center[i]]]++;
		int s = 0;
		for (int i = 1; i <= 3; i++)
			s = Math.max(s, cnt[i]);
		return 8 - s;
	}

//	操作函数:将所有元素往头元素的方向移一位,头元素放在最后一位
	static void operation(int x)
	{
		int t = a[op[x][0]];// 存头元素
		for (int i = 0; i < 6; i++)
			a[op[x][i]] = a[op[x][i + 1]];
		a[op[x][6]] = t;
	}
//	u 表示当前层数,maxd 表示IDA*的最大深度,pre表示前一个操作(避免做无用功)
	static boolean dfs(int u, int maxd, int pre)
	{
//		IDA*加深
		if (u + f() > maxd)
			return false;
//		递归出口
		if (check())
			return true;

//		枚举操作
		for (int i = 0; i < 8; i++)
		{
			if (opposite[i] == pre)// 做相反的操作 == 白做
				continue;
			operation(i);// 进行 i 操作
			path[u] = i;
			if (dfs(u + 1, maxd, i))
				return true;
			operation(opposite[i]);
		}
		return false;
	}

	public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext())
		{
			int a1 = sc.nextInt();
			if (a1 == 0)
				break;
			a[0] = a1;
			for (int i = 1; i < 24; i++)
				a[i] = sc.nextInt();
			int dep = 0;
			while (!dfs(0, dep, -1))
			{
				dep++;
			}
			if (dep == 0)
				System.out.println("No moves needed");
			else
			{
				for (int i = 0; i < dep; i++)
					System.out.printf("%c", 'A' + path[i]);
				System.out.println();
			}
				System.out.println(a[6]);
		}
	}
}

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

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

相关文章

ChatGPT会取代低代码开发平台吗?

编程作为一种高端技能&#xff0c;向来是高收入高科技的代名词。近期&#xff0c;伴随着ChatGPT在全球的爆火&#xff0c;过去通过窗口“拖拉拽”的所见即所得方式的低代码开发模式&#xff0c;在更加智能和更低成本的AI搅局之下&#xff0c;又面临了更深层次的影响。 低代码平…

MySQL redo log、undo log、binlog

MySQL是一个广泛使用的关系型数据库管理系统&#xff0c;它通过一系列的日志来保证数据的一致性和持久性。在MySQL中&#xff0c;有三个重要的日志组件&#xff0c;它们分别是redo log&#xff08;重做日志&#xff09;、undo log&#xff08;回滚日志&#xff09;和binlog&…

MyBatis深入学习总结

MyBatis总结 MyBatis入门操作 简介 原始jdbc操作&#xff08;查询数据&#xff09; 原始jdbc操作&#xff08;插入数据&#xff09; 原始jdbc操作的分析 原始jdbbc开发存在的问题如下&#xff1a; 数据库连接创建、释放频繁造成系统资源的浪费从而影响系统性能sql语句在代…

深度学习基础知识-tf.keras实例:衣物图像多分类分类器

参考书籍&#xff1a;《Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition (Aurelien Geron [Gron, Aurlien])》 本次使用的数据集是tf.keras.datasets.fashion_mnist&#xff0c;里面包含6w张图&#xff0c;涵盖10个分类。 import tensorflo…

Linux中的ACL以及加固

ACL访问控制 // ACL:Access Control List 访问控制列表 // -p :以原始格式显示 ACL [rootzbx ~]# getfacl -p /root/ // 查看ACL策略 # file: /root/ # owner: root # group: root user::r-x group::r-x other::--- 设置ACL策略 // -m : 修改文件的ACL // -b : 表示删除所有的…

RedisGraph的图存储模型

1 overview 在RedisGraph的整体架构中&#xff0c;非常简略的概括了RedisGraph的图存储模型&#xff1a; RedisGraph使用DataBlock来存储node和edge的属性。RedisGraph使用稀疏矩阵来表示图&#xff0c;稀疏矩阵的存储格式为按行压缩的稀疏矩阵&#xff08;Compressed Sparse…

同浏览器下多窗口进行跨源通信、同源通信

同浏览器下多窗口进行跨源通信、同源通信 多页面通信运用到了“发布订阅”的设计模式&#xff0c;一个页面发布指令&#xff0c;其他页面进行订阅并进行相应的行为操作&#xff01; 一、跨源通信 window.postMessage() window.postMessage() 方法可以安全地实现跨源通信。通常…

Qt6之调用Windows下vc生成的动态链接库dll

Qt是跨平台工具&#xff0c;显然能和windows的动态库一起使用。 在Windows操作系统上&#xff0c;库以文件的形式存在&#xff0c;并且可以分为动态链接库(DLL) 和静态链接库两种。动态链接库文控以.dll为后缀名&#xff0c;静态链接库文控以.lib为后缀名。不管是动态链接库还是…

独立站卖家如何应对PayPal风险?3大策略教你安全收款!

PayPal是全球风险控制做得最好的第三方在线支付平台&#xff0c;PayPal付款是钱直接到卖家PayPal账户。但随着外贸交易的日益发展&#xff0c;恶意买家的问题也越来越多。如何防范风险&#xff0c;保证收款安全&#xff0c;成为独立站卖家们所关注的问题。下面为大家分享三种策…

背包DP-入门篇

目录 01背包&#xff1a; 完全背包&#xff1a; 多重背包&#xff1a; 分组背包&#xff1a; 01背包&#xff1a; [NOIP2005 普及组] 采药 - 洛谷https://www.luogu.com.cn/problem/P1048 01背包背景 在一个小山上&#xff0c;有个n个黄金和一个容量为w的背包&#xff0c;…

【Python】深度理解Class类、Object类、Type元类的概念和关系

深度理解Class类、Object类、Type元类 1.Class类、Object类、Type元类的表面关系2.Class、Object、Type解释3.关系详解4.那么如何看待object、type在Python面对对象概念中的一席之地呢&#xff1f;5.那么object、type扮演了什么样的角色呢&#xff1f;他们对class又分别做了什么…

【计算机组成】Cache与CPU的直接映射、全相联映射与组相联映射

一.Cache与CPU需要映射的原因 CPU准备访问内存时&#xff0c;会先问问cache存储器有没有已经提前准备好了数据&#xff0c;如果没有则再找内存要&#xff1a; 如果Cache刚好命中&#xff0c;则直接从Cache中读取数据&#xff1a; 如果Cache没有命中&#xff08;Cache失效&#…

时序数据库InfluxDB快速入门使用

推荐博客&#xff1a; Influxdb中文文档 linux安装influxdb Influxdb安装、启动influxdb控制台、常用命令、Influx命令使用、Influx-sql使用举例、Influxdb的数据格式、Influxdb客户端工具 1.安装 1、influxdb数据库官网的下载链接&#xff1a; https://portal.influxdata.c…

如何利用MES系统进行生产防呆防错?

一、认识MES系统的防呆防错功能 首先&#xff0c;我们要清楚了解&#xff0c;什么是MES系统的防呆防错。MES系统防呆防错是指利用MES系统来避免生产过程中的错误和缺陷&#xff0c;保障生产排程和生产过程顺利进行的过程。MES系统防呆防错包括以下方面&#xff1a; 1. 自动识别…

relation-graph关系图谱组件2.0版本遇到的问题

前提&#xff1a;之前已经写过一篇1.1版本的问题&#xff0c;这里就不过多讲了&#xff08;如果想要解决火狐低版本兼容&#xff0c;看那个就行&#xff09; 这次主要讲的是和1.X版本的区别和一些其它问题 区别 参数名不同&#xff1a;以前的links>lines (虽然现在links也…

遇见未来,降低职场焦虑——中国人民大学与加拿大女王大学金融硕士来助力

身在职场的你有感到一丝丝的焦虑吗&#xff1f;偶尔的小焦虑可以作为我们工作中的动力&#xff0c;时刻提醒我们保持奋进。预见未来才能遇见未来&#xff0c;随着社会经济不断发展&#xff0c;没有什么是一成不变的。处于职场上升期的我们更要懂得未雨绸缪&#xff0c;增加自身…

ClickHouse集群搭建总结

简介 ClickHouse是俄罗斯最大的搜素引擎Yandex于2016年开源的列式数据库管理系统&#xff0c;使用C 语言编写, 主要应用于OLAP场景。 使用理由 在大数据量的情况下&#xff0c;能以很低的延迟返回查询结果。 笔者注&#xff1a; 在单机亿级数据量的场景下可以达到毫秒级的查询…

SpringCloudAlibaba 微服务生态

一 微服务架构 1.1 微服务 微服务其实是一种架构风格&#xff0c;我们在开发一个应用的时候这个应用应该是由一组小型服务组成&#xff0c;每个小型服务都运行在自己的进程内&#xff1b;小服务之间通过HTTP的方式进行互联互通。 1.2 微服务架构的常见问题 一旦采用微服务系…

ChatGPT 之后,B 端产品设计会迎来颠覆式革命吗?| Liga妙谈

近日&#xff0c;脑机接口公司 Neuralink 宣布&#xff0c;其植入式脑机接口设备首次人体临床研究已被准许启动。遥想当年&#xff0c;我们还嘲讽罗老师「动嘴做 PPT」&#xff0c;谁曾想不久后我们可能连嘴都不用动&#x1f64a;。 脑机接口何时会引爆人机交互革命尚未可知&a…

简述三观;

文章目录 三观世界观人生观价值观三观不合怎么看三观不正: 教养育儿教育心智不成熟的表现 三观 指人生观&#xff0c;世界观和价值观; https://wenku.baidu.com/view/102a655fd4bbfd0a79563c1ec5da50e2534dd1d8.html?fraladdin664466&ind1&_wkts_1685949448098&…