UVA1343 旋转游戏 The Rotation Game(IDA*)

例题7-12 旋转游戏 UVa1343 1.题目描述:点击打开链接 2.解题思路:本题利用迭代加深搜索解决。好久没做这个专题了,感觉这种方法有点力不从心,不会寻找估价函数是硬伤。。。只好学一学别人的代码。 本题要求棋盘中间的8个方格都要是相同的数字。紫书上说是利用状态空间搜索解决,大致模板还是八数码问题的模板。但是写了半天最后WA了,感觉这道题用那个模板写出来会很复杂。最后看别人的代码,才发现大多都是利用迭代加深搜索解决的,代码量也 阅读详情

题目链接(原题地址链接)

思路

  • 这是一道比较显然的IDA*题,只是对读入预处理及操作处理比较麻烦
  • 注意剪枝:排除等效分支。

代码

#include<cstdio>
#define ri register int
using namespace std;
int a[8][8];
int n[25],tong[10];
char ans[100];
char c[9]={'\0','A','B','C','D','E','F','G','H'};
int fan[9]={0,6,5,8,7,2,1,4,3};//逆操作 
int k,f;
int read(){//快读 
	int x=0;char c=getchar();
	while(c>'9'||c<'0') c=getchar();
	while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();
	return x;
}
void cz(int x){//模拟 
	int t;
	if(x==1){
		t=a[1][3];
		for(ri i=1;i<=6;++i) a[i][3]=a[i+1][3];
		a[7][3]=t;
	}
	if(x==2){
		t=a[1][5];
		for(ri i=1;i<=6;++i) a[i][5]=a[i+1][5];
		a[7][5]=t;
	}
	if(x==3){
		t=a[3][7];
		for(ri i=7;i>=2;--i) a[3][i]=a[3][i-1];//注意倒序 
		a[3][1]=t;
	}
	if(x==4){
		t=a[5][7];
		for(ri i=7;i>=2;--i) a[5][i]=a[5][i-1];
		a[5][1]=t;
	}
	if(x==5){
		t=a[7][5];
		for(ri i=7;i>=2;--i) a[i][5]=a[i-1][5];
		a[1][5]=t;
	}
	if(x==6){
		t=a[7][3];
		for(ri i=7;i>=2;--i) a[i][3]=a[i-1][3];
		a[1][3]=t;
	}
	if(x==7){
		t=a[5][1];
		for(ri i=1;i<=6;++i) a[5][i]=a[5][i+1];//注意是从1到6 
		a[5][7]=t;
	}
	if(x==8){
		t=a[3][1];
		for(ri i=1;i<=6;++i) a[3][i]=a[3][i+1];
		a[3][7]=t;
	}
}
void pre(){//预处理a 
	a[1][3]=n[1],a[1][5]=n[2];
	a[2][3]=n[3],a[2][5]=n[4];
	for(ri i=1;i<=7;++i) a[3][i]=n[i+4];
	a[4][3]=n[12],a[4][5]=n[13];
	for(ri i=1;i<=7;++i) a[5][i]=n[i+13];
	a[6][3]=n[21],a[6][5]=n[22];
	a[7][3]=n[23],a[7][5]=n[24];
}
bool pd(){//判断是否符合题意 
	int k=a[3][3];
	for(ri i=3;i<=5;++i)
		for(ri j=3;j<=5;++j)
		{
			if(i==4&&j==4) continue;
			if(a[i][j]!=k) return 0;
		}
	return 1;
}
int max(int x,int y,int z){//三个数比较大小 
	if(y>x) x=y;
	if(z>x) x=z;
	return x;
}
int js(){//预估函数 
	tong[1]=tong[2]=tong[3]=0;
	for(ri i=3;i<=5;++i)
		for(ri j=3;j<=5;++j)
		{
			if(i==4&&j==4) continue;//4,4是空的 
			tong[a[i][j]]++;
		}
	return 8-max(tong[1],tong[2],tong[3]);//即剩下多少个不同的 
}
void dfs(int s,int la){//IDA* 
	if(s>=k) return;
	for(ri i=1;i<=8;++i)
	{
		if(i==fan[la]) continue;//如果是上一次操作的逆过程,那么显然无异议,剪枝 
		cz(i);//操作 
		ans[s]=c[i];//记录操作 
		int tmp=js()+s;//预估 
		if(pd())//判断是否到达目标态 
		{
			f=1;
			return;
		}
		if(tmp<=k) dfs(s+1,i);//剪枝 
		if(f) return;
		cz(fan[i]);//复原操作 
		ans[s]=c[0];//可有可无 
	}
}
void solve(){
	for(ri i=1;i<=24;++i)
	{
		n[i]=read();
		if(n[i]==0) return;
	}
	pre();k=f=0;
	if(pd())//特判 
	{
		printf("No moves needed\n");
		printf("%d\n",a[3][3]);//注意输出这个,注意不要打多了\n 
		return;
	}
	while(++k)//限定搜索深度,迭代加深 
	{
		dfs(0,0);
		if(f)//找到答案 
		{
			for(ri i=0;i<k;++i) printf("%c",ans[i]);
			printf("\n%d\n",a[3][3]);
			break;//退出 
		}
	}
}
int main(){
	n[1]=1;
	while(n[1]) solve();
	return 0;
}
Autodesk激活无无网络选项?许可类型与脱机激活排查修复指南 软件许可激活是保障正版授权正常使用的核心环节,常见的授权模式包括单机版许可和网络版许可,两者在认证机制和应用场景上有所区别。单机版离线授权依托 FlexNet Licensing Service 等底层服务组件,在断网或内网环境下为用户提供可靠的技术支持与授权验证路径。然而在实际部署中,激活窗口并不总是显示“无网络激活方式”入口,这可能与许可类型选择、网络环境干扰、组件安装残留或系统时间偏差有关。理解入口的动态呈现逻辑与排查顺序,有助于在 AutoCAD、Revit 等 Autodesk 产品中高效解决脱机 阅读详情

相关推荐

128x64 OLED屏的救星:手把手教你用纯C实现轻量级多级菜单

本文针对资源受限的单片机开发场景,提供了一套用纯C语言实现128x64 OLED屏轻量级多级菜单的完整方案。该方案摒弃了传统的树形指针结构,创新性地采用哈希表进行菜单项管理,核心代码不足200行,内存占用极低,逻辑清晰且易于维护。文章详细阐述了架构设计、实战演练及性能优化技巧,是STM32、ESP8266等小内存MCU项目的理想选择。

table的专栏 227

例题7-12 UVA - 1343 The Rotation Game 旋转游戏(IDA*)

题目大意: 给一个棋盘,问最少进行几次旋转使得中间的数字全部相等!(并且字典序最小!) 思路: 借鉴了代码仓库,感觉写的很巧妙,简单记录一下! 大致思路: 用line [][] 二维数组给棋盘进行标号! a[] 一维数组代表当前的棋盘中棋子的标号! center[] 一维数组代表棋盘中间棋子的标号! rev[]数组进行反转列 ,减少了很多代码! 先判断是否合法,合法的话直接输出。

aozil_yang的博客 597

优惠券管理

(请设计一个优惠券兑换码生成方案,可以支持20亿以上的唯一兑换码,兑换码长度不超过10,只能包含字母数字,并且要保证生成和校验算法的高效)最后把签名值的后14位、新鲜值(4位)、自增序列(32位)拼接,得到一个50位二进制数,然后与一个较大的质数做异或运算加以混淆,再基于Base32或Base64转码,即可的对兑换码。现在,就剩下防止爆刷了。自增id从1增加到Integer的最大值,可以达到40亿以上个数字,而占用的字节仅仅4个字节,也就是32个bit位,距离50个bit位的限制还有很大的剩余,符合要求!

qq_36312661的博客 2204

UVa 1343 旋转游戏(The Rotation Game)

题目: 往八个方向旋转棋盘,要求中间的八个相同,求最小步数,以及如何移动。 分析: IDA* 启发函数 深度 + 不相同个数 > maxd 就退出。 #include<bits/stdc++.h> #define LL long long using namespace std; /* 00 01 02 03 04 05 06 07 08...

Inuyasha__的博客 305

LTC3783 LED驱动控制器设计与效率优化详解

开关电源控制器是现代LED照明的核心器件,通过电流模式控制实现高效能量转换。其核心原理是通过采样电阻检测负载电流,配合误差放大器形成闭环调节,在汽车电子、显示背光等场景中确保±3%的电流精度。LTC3783作为典型代表,集成升压/降压-升压多拓扑支持,配合PWM调光技术可实现3000:1的无色偏调光范围。在工程实践中,需重点考量功率电感选型、MOSFET开关损耗与热管理设计,例如在38W功率方案中采用10μH/5A电感和4.5mΩ MOSFET可达成95%效率。该方案特别适用于需要应对9-36V宽输入电压波

weixin_36231030的博客 399

基于Playwright+Pytest+Yaml+Allure的UI自动化测试框架实战指南

本文详细介绍了基于Playwright+Pytest+Yaml+Allure的UI自动化测试框架实战指南,涵盖环境搭建、核心功能实现及高级技巧。通过数据驱动测试、页面操作封装和智能等待机制,提升测试效率与可维护性。Allure报告增强功能为团队提供直观的质量反馈,助力高效UI自动化测试。

weixin_28826521的博客 488

UVa 1343 The Rotation Game 旋转游戏 IDA* BFS 路径还原

算法,直接依次枚举进行的操作(需要注意的是,应该先枚举字典序小的),很明显可以发现,每一次移动最多只会让中间的位置正确的数字个数增加一,所以可以考虑的剪枝是:最大深度与当前深度之差如果小于中间最少的不对的数字时进行剪枝。来解决本题的时候,我们可以转换一下思路,我们可以把目标状态能够到达的所有其他状态枚举出来,这样的花费与从某个状态到目标状态是一样的。操作如何进行,其他的操作如何进行可以类似的推出,你的任务是找到最少的操作步数让中间的八个数字为同一个数字,例如上图左边经过两次操作能将中间全部变成。

qq_45523675的博客 512

Flash芯片的VCC上电到可操作时间过长

Flash的VCC上电到操作时间(tVSL)通常有最大值限制,如果超过这个时间,核心风险是状态机不同步和指令锁存错误。比如芯片内部振荡器可能已经尝试启动又休眠了,但主控却在这之后才发送指令,导致完全 misinterpreted。Flash芯片的(从电源上电到可以正常进行读写操作的时间)如果过长,会产生一系列负面影响简单来说,这个时间过长意味着电源上升速度太慢,违反了芯片的要求。

qq_61918649的博客 722

UVA1343 The Rotation Game旋转游戏

题目:如题,棋盘上由数字1,2,3组成,往A,B,C,D,E,F,G,H8个方向旋转棋盘,使得中间8个数相等,最多有几步。 分析:这题关键在于最大深度的判断,有几个不等数字,就说明至少还需要移动几次,还有一个关键地方就是映射,将8个方向的旋转映射到一维数组。           00      01           02      03 04 05 06 07 08 09 10    ...

timeruler的博客 421

Attention优化|2w字原理&图解: 从Online-Softmax到FlashAttention V1/V2/V3

本文通过原理分析和图解的方式,通俗易懂地FlashAttention系列算法。FlashAttention V1/V2在LLM领域的应用已经非常广泛,相关的论文也反复读了几遍。FA1和FA2论文非常经典,都推荐读一下(不过FA2论文中公式错误不少本文大约1.8w字,包括以下内容:0x07 分布式训推使用FlashAttention0x09 FlashAttention中MQA/GQA以及Causal Mask处理。

具身机器人和通用AI 5232

FPGA工程师面试——FPGA基础知识24题

线与逻辑是两个输出信号相连可以实现与的功能。在硬件上,要用OC门(集电极开路与非门)来实现,由于不用OC门可能使灌电流过大,而烧坏逻辑门,因此在输出端口应加一个上拉电阻。

FPGA/MATLAB学习教程/源码/项目合作开发 1086

UVa 1343 The Rotation Game (状态空间搜索 && IDA*)

题意:有个#字型的棋盘,2行2列,一共24个格。 如图:每个格子是1或2或3,一共8个1,8个2,8个3. 有A~H一共8种合法操作,比如A代表把A这一列向上移动一个,最上面的格会补到最下面。 求:使中心8个格子数字一致的最少步骤,要输出具体的操作步骤及最终中心区域的数字。如果有多个解,输出字典序最小的操作步骤。 分析 : 还是状态空间的搜索,对象就是一个数字序列,判断...

153

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

UVA 1343 The Rotation Game (IDA*)

分析:IDA*往下搜就行了,刚开始想不写估价水过去,想多了,还得写估价。我们可以发现,每旋转一次,不同的数字最多会减少1,即相同的数字最多会增加一。所以我们找到1,2,3中目前最多的那个数的数目,然后用8减去这个数,就是我们至少需要旋转的次数。 代码: #include &lt;iostream&gt; #include &lt;cstdio&gt; #include &lt;cstring...

Insist_77的博客 342

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

HDU1667 POJ2286 UVA1343 LA3265 The Rotation Game【IDA*】

The Rotation Game Time Limit: 45000/15000 MS (Java/Others) Memory Limit: 150000/150000 K (Java/Others) Total Submission(s): 2766 Accepted Submission(s): 1119 Problem Description The rotation gam...

海岛Blog 597

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

POJ 2286 UVA 1343 The Rotation Game IDA*

以前看刘汝佳的方法写过,现在再写一遍 以下是自己意淫的IDA* g()是旋转的次数 ; h()的求法:每次移动最多只会使得中央区域包含的数字种类减少1种。求出中央区域个数最多的那个数字的个数 n, 要达到中央区域数字都相同,至少需要 8-n次操作,此即估价函数值 // 1 2 // 3 4 // 5 6 7 8 9 10 11

BRCOCOLI的博客 422

UVA - 1343 The Rotation Game (BFS/IDA*)

题目链接 紫书例题。 首先附上我第一次bfs+剪枝TLE的版本: 1 #include<bits/stdc++.h> 2 3 using namespace std; 4 typedef long long ll; 5 const int N=24+2,inf=0x3f3f3f3f; 6 const int b[][10]= { ...

weixin_30294709的博客 190

The Rotation Game UVA - 1343(IDA*)

https://www.cnblogs.com/Bowen-/p/4955782.html 题意 有个#字型的棋盘,2行2列,一共24个格。 如图:每个格子是1或2或3,一共8个1,8个2,8个3. 有A~H一共8种合法操作,比如A代表把A这一列向上移动一个,最上面的格会补到最下面。 求:使中心8个格子数字一致的最少步骤,要输出具体的操作步骤及最终中心区域的数字。如果有多个解,输出字...

leekerian的博客 220

UVA 1343 The Rotation Game IDA*

使用IDA*的思想解题, 主要的难点在于如何模拟Rotate操作,以及在检查终点和启发函数时检测中心的8个方格数字是否相同 #include &lt;cstdio&gt; #include &lt;algorithm&gt; using namespace std; /* 方格编号 00 01 02 03 04 05 06 07 08 09 10 ...

hanker99的博客 196

例题 7-12 旋转游戏(The Rotation Game,Shanghai 2004,UVa1343)

原题链接:https://vjudge.net/problem/UVA-1343 分类:朴素剪枝 备注:IDA*算法,模拟 令人惊讶的是最朴素的IDA*(剪枝)方法居然可以这么快。 直接判断剩下的凑不齐的数目是否大于剩下可以转的次数即可。 #include<bits/stdc++.h> using namespace std; int row1[7], row2[7], col1[7], col2[7]; int rowh1, rowh2, colh1, colh2, pos; char ans

TK_wang_的博客 214

Uva 1343 The Rotation game (IDA*题解 耗时60ms)

题目大意 The rotation game uses a # shaped board, which can hold 24 pieces of square blocks (see Fig.1). The blocks are marked with symbols 1, 2 and 3, with exactly 8 pieces of each kind. Initially, the blocks are placed on the board randomly. Your task is to

qq_41201328的博客 208

UVA 1343 The Rotation Game

https://vjudge.net/problem/UVA-1343 题目 给出一种井字棋盘,只含数字1、2、3,只允许六种移动,问如何移动才能使棋盘中间八格数字相等,输出步数最少的操作,如果有多个步数相同的操作,输出字典序最小的操作 题解 每一步操作都有点麻烦,先写个工具模拟所有操作 先编号,方便输入和操作 只看A操作 操作后下面的数占据了上面的位置,然后就...

187

The Rotation Game (UVA - 1343)

有个#字型的棋盘,2行2列,一共24个格。 如图:每个格子是1或2或3,一共8个1,8个2,8个3. 有A~H一共8种合法操作,比如A代表把A这一列向上移动一个,最上面的格会补到最下面。 求:使中心8个格子数字一致的最少步骤,要输出具体的操作步骤及最终中心区域的数字。如果有多个解,输出字典序最小的操作步骤。 解题思路:紫书上的题目,紫书上有两种解法,一种是重复三遍b

白黑菜的博客 532

紫书搜索 例题7-12 UVA - 1343 The Rotation Game IDA*迭代加深搜索

题目链接: https://vjudge.net/problem/UVA-1343 题意: 数字1,2,3都有八个,求出最少的旋转次数使得图形中间八个数相同。 旋转规则:对于每一长行或每一长列,每次旋转就是将数据向头的位置移动一位,头上的数放置到尾部。若次数相同,则找出字典序最小旋转次序。 输入是从上到下,从左向右,注意方向 题解: 代码: 1 #include &l...

weixin_30572613的博客 117

UVa #1343 The Rotation Game (例题7-12)

IDA*,发现这个算法真的很好用,感觉像是结合了bfs步数最少和dfs字典序最小的优点,第一次到达目标就可以输出。启发函数的剪枝也是效果令人惊喜。 另外这道题不需要对转盘的状态进行判重也可以获得很好的效果。 因为8个转轮对应的位置比较没有规律,需要提前将这些位置存在数组中,方便旋转操作和回溯法的归位操作。利用数组来人为储存没有规律的数字是很不错的一个想法,借鉴于目前唯一能找到的

专攻挖掘机炒鸡蛋算法的专栏 1486

uva1343(The Rotation Game)=>IDA*

因为8个转轮对应的位置比较没有规律,需要提前将这些位置存在数组中,方便旋转操作和回溯法的归位操作。 利用数组来人为储存没有规律的数字。可以使用IDA*的算法。 IDA*合了bfs步数最少和dfs字典序最小的优点。 本题的移动比较复杂,因此应当事先保存A,B,C,D四个方向的位置,后四个方向可以反推出来。同时还要保存要观察的8个格子的位置。接下来,先判断是否就是目标状态,如果不是,进行

CCCmaster的博客 672

UVA 1343 The Rotation Game 【IDA*】

The Rotation Game  UVA - 1343  #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define ll long l

Puya的博客 353
上一篇: P3959 [NOIP2017 提高组] 宝藏(随机化贪心)
下一篇: P1488 肥猫的游戏(博弈论)
Robin_w2321
博客等级 码龄7年 28粉丝 54原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Robin_w2321

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值