Openjudge1288 The Rotation Game(dfs)

可持久化线段树(主席树) 摘要 主席树,又称可持久化线段树,属于可持久化数据结构。“主席”这一名词是由于发明者缩写为HJT,和某位主席拼音缩写相同(有些牵强),故将该数据结构称为主席树。 主席树既保留了线段树的灵活,也拥有了可持久化数据结构的特点,在处理某些特定问题时有着其它数据结构不具有的优势。 本文将首先介绍什么是“可持久化数据结构”,随后介绍主席树的思想,关于代码实现将结合例题讲解。 可持久化数据结构 可持久数据结构... 阅读详情

总时间限制: 
15000ms 
内存限制: 
150000kB
描述
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 move the blocks so that the eight blocks placed in the center square have the same symbol marked. There is only one type of valid move, which is to rotate one of the four lines, each consisting of seven blocks. That is, six blocks in the line are moved towards the head by one block and the head block is moved to the end of the line. The eight possible moves are marked with capital letters A to H. Figure 1 illustrates two consecutive moves, move A and move C from some initial configuration. 
输入
The input consists of no more than 30 test cases. Each test case has only one line that contains 24 numbers, which are the symbols of the blocks in the initial configuration. The rows of blocks are listed from top to bottom. For each row the blocks are listed from left to right. The numbers are separated by spaces. For example, the first test case in the sample input corresponds to the initial configuration in Fig.1. There are no blank lines between cases. There is a line containing a single `0' after the last test case that ends the input. 
输出
For each test case, you must output two lines. The first line contains all the moves needed to reach the final configuration. Each move is a letter, ranging from `A' to `H', and there should not be any spaces between the letters in the line. If no moves are needed, output `No moves needed' instead. In the second line, you must output the symbol of the blocks in the center square after these moves. If there are several possible solutions, you must output the one that uses the least number of moves. If there is still more than one possible solution, you must output the solution that is smallest in dictionary order for the letters of the moves. There is no need to output blank lines between cases. 
样例输入
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


类似数独的一个dfs,要把中间的一圈拼成数字一样的。


AC代码:


#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
int map[10][10], has[8] = {3, 5, 3, 5, 5, 3, 5, 3}, step;
char ans[100];
int get_h()
{
	int num[10] = {0};
	for(int i = 3; i <= 5; ++i) {
		num[map[3][i]]++;
		num[map[5][i]]++;
	}
	num[map[4][3]]++;
	num[map[4][5]]++;
	return max(num[1], max(num[2], num[3]));
}
void turn_col(int k, int flag)
{
	int tem;
	if(flag) {
		tem = map[1][k];
		for(int i = 2; i <= 7; ++i)
			map[i - 1][k] = map[i][k];
		map[7][k] = tem;
	}
	else {
		tem = map[7][k];
		for(int i = 7; i >= 2; --i)
			map[i][k] = map[i - 1][k];
		map[1][k] = tem;
	}
}
void turn_row(int k, int flag)
{
	int tem;
	if(!flag) {
		tem = map[k][1];
		for(int i = 2; i <= 7; ++i)
			map[k][i - 1] = map[k][i];
		map[k][7] = tem;
	}
	else {
		tem = map[k][7];
		for(int i = 7; i >= 2; --i)
			map[k][i] = map[k][i - 1];
		map[k][1] = tem;
	}
}
int dfs(int cnt)
{
	int tem = get_h();
	if(tem == 8 && cnt == step) return 1;
	if(cnt + (8 - tem) > step) return 0;
	char c;
	for(int i = 0; i < 8; ++i) {
		c = i + 'A';
		ans[cnt] = c;
		if(c == 'A' || c == 'B') {
			turn_col(has[i], 1);
			if(dfs(cnt + 1)) return 1;
			turn_col(has[i], 0);
		}
		else if(c == 'E' || c == 'F') {
			turn_col(has[i], 0);
			if(dfs(cnt + 1)) return 1;
			turn_col(has[i], 1);
		}
		else if(c == 'C' || c == 'D') {
			turn_row(has[i], 1);
			if(dfs(cnt + 1)) return 1;
			turn_row(has[i], 0);
		}
		else if(c == 'G' || c == 'H') {
			turn_row(has[i], 0);
			if(dfs(cnt + 1)) return 1;
			turn_row(has[i], 1);
		}
	}
	return 0;
}
int main(int argc, char const *argv[])
{
	int a;
	while(scanf("%d", &a) != EOF && a) {
		map[1][3] = a;
		scanf("%d", &a);
		map[1][5] = a;
		for(int i = 2; i <= 7; ++i)
			if(i == 3 || i == 5) 
				for(int j = 1; j <= 7; ++j)
					scanf("%d", &map[i][j]);
			else scanf("%d%d", &map[i][3], &map[i][5]);
		if(get_h() == 8) {
			printf("No moves needed\n%d\n",map[3][3]);
			continue;
		}
		step = 1;
		while(1) {
			if(dfs(0)) break;
			step++;
		}
		ans[step] = '\0';
		printf("%s\n%d\n", ans, map[3][3]);
	}
	return 0;
}


【学习笔记】浅谈主席树(可持久化线段树) 主席树上没有主席,就跟老婆饼里没有老婆,Bamboo_Day 里没有 Bamboo 是一样的。之所以叫主席树,是因为发明这个数据结构的人名字缩写为hjt跟某位伟大的主席一样。主席树是在的基础上发展出来的,所以你要先学会当然你还要学会。 阅读详情

相关推荐

【算法学习】主席树入门

主席树入门 原理 主席树入门 主席树,也叫做可持久化线段树,准确来说,应该叫做可持久化权值线段树,因为其中的每一颗树都是一颗权值线段树。 所谓权值线段树,就是指线段树的叶子节点保存的是当前值的个数。这样说起来比较抽象,下面用具体例子来简单阐述。 如有数列:2 1 2 5 1 1 1 3,不难统计出,数列中数字1出现了4次,数字2出现了2次,数字3、数字5都出现了1次,对于这...

Pengwill's Blog 2万+

主席树详解(基础)

可持久化线段树,又称主席树,本文详解它的构成和基础用法

nxhx_的博客 4661

Vitis HLS 学习指南与实践教程

Vitis HLS 学习指南与实践教程摘要:本文系统介绍了AMD Vitis HLS工具及其应用。HLS技术将C/C++代码自动转换为硬件描述语言,显著提升FPGA开发效率(5-10倍)。文章对比了HLS与传统RTL设计的优势,包括抽象级别高、开发周期短、代码重用性强等特点。详细讲解了Vitis HLS工具链的核心功能,包括支持的C/C++特性(如任意精度数据类型)、开发流程(项目创建-代码编写-仿真-综合)以及关键优化技术(流水线、循环展开、数组分割等编译指示)。通过具体代码示例展示了HLS设计方法,为F

weixin_44707118的博客 1401

主席树(POJ-2104、HDU-2665)

【算法分析】 主席树名称来源于其发明人黄嘉泰的姓名的首字母缩写HJT与我们某位主席姓名的首字母缩写一样。 主席树的经典应用在于求某个区间内的第K小/大数的值。比如区间第K大问题,就是给定一个数列a,询问给定区间[L,R]的第K大值。如对数列a=[4,1,3,2,5],针对询问L=2,R=5,K=2,其答案为2。 主席树是一种可持久化数据结构,即可持久化权值线段树。 为了实现可持久化,就要保存线...

hnjzsyjyj的专栏 3566

解决UNITE数据库注释高unassigned率:手把手教你训练专属真菌分类器(含预训练模型分享)

本文针对使用UNITE数据库进行真菌ITS序列注释时出现的高未分配率问题,提供了详细的实战解决方案。通过对比vsearch直接注释与Naive Bayes分类器的原理差异,文章手把手指导读者在QIIME 2环境中训练专属分类器,包括数据准备、模型训练、参数优化及效果验证,并分享了预训练模型,旨在显著提升真菌群落分析的注释准确性和数据利用率。

weixin_29214199的博客 338

GPU八卡A100使用INT4-W4A16量化大模型实验

本实验旨在探索在环境下,对大语言模型进行权重量化的可行性、效率与性能影响。通过采用工具集成 GPTQ 算法,实现对所有线性层的权重量化(W4A16 方案最终通过lm-eval工具在GSM8K任务上对压缩模型进行评估。

goodgood_UP的博客 1909

可持久化数据结构-线段树(主席树)

可持久化线段树的概念和简单运用

zje11的博客 2741

芒果YOLO11改进17:即插即用 | 损失函数Repulsion Loss|Repulsion 解决目标遮挡场景下的目标检测,为解决密集人群检测中遮挡设计的损失函数,打造高效

即插即用 | 损失函数Repulsion Loss|Repulsion 解决目标遮挡场景下的目标检测,为解决密集人群检测中遮挡设计的损失函数,打造高效

包括YOLOv5、YOLOv7、YOLOv8等模型改进 483

主席树简介及应用

【主席树简介】 主席树,即可持久化线段树,又称函数式线段树,是重要的可持久化数据结构之一。所谓可持久化,是指可以回溯到历史版本。 主席树的本质,就是在有数据更新时,在基准线段树的基础上采用“结点复用”的方式仅仅增加少量结点来维护历史数据,而不是通过存储不同版本线段树的方式来维护历史数据,从而达到减少时空消耗的目的,避免出现TLE(Time Limit Exceeded)及MLE(Memory Limit Exceeded)错误。主席树空间一般建议是开n<<5(n为基准线段树的结点数)。 如在..

hnjzsyjyj的专栏 3313

ABAP 大规模数据并行处理实战,六套 Parallel Processing Framework 如何选,性能调优真正该盯住什么

如果今天真的面对那份执行 14 个小时的生产报表,我不会马上把原来的 Loop 改成 50 个aRFC。我会先用 SAT、ST12、SQL Monitor 和 HANA 侧工具确认时间到底花在哪里。如果 90% 时间其实消耗在一条低效 SQL 上,Parallel Processing 只是让 50 个 Worker 同时执行那条低效 SQL,数据库会比原来更痛苦。应该先把串行逻辑本身优化到合理水平。该做 Set-based Processing 的地方先交给 HANA。该避免SELECT。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 149

彻底解决Win11锁屏界面黑屏或者图片不变化

windows锁屏后黑屏

renkai721的专栏 1万+

主席树(可持久化线段树)

2019.11.4 今天总算弄会主席树了,发现确实不难,但是需要跳出常规线段树的思维,特别是处理子树上面 主席树的定义与作用 主席树,也称可持久化线段树,那么什么是可持久化线段树呢,即为一颗记录了所有更新过程的线段树。能够处理出从第i次更新到第j次更新的线段树变化,具体作用一会见例题。 主席树的功能 记录所有过程的线段树,按正常思维是需要开O(N*M)这么大的空间的,时间也为O(n*m),...

孙煜晗的博客 7009

【如何学习CAN总线测试】——Python+Robot Framework框架实现UDS诊断自动化

由于项目需要进行UDS诊断测试,所以对这方面进行了研究学习,网上很少能查询到相关资料,故记录一下UDS自动化测试开发过程,由于保密原则,案例都是Demo,希望能帮到感兴趣的朋友。

测试领域技术分享 7466

关于主席树

什么是主席树? 主席树又叫做可持久化线段树,其实后者才是它的大名只是大家都图方便就叫前者了。 可持久化线段树,一听名字就知道它的两个终点:可持久化,线段树。 都要学主席树了,线段树是什么总归都知道的吧,那什么是可持久化呢? 可持久化理解起来其实也很简单,说白了就是可以查询历史节点就可以叫可持久化了,所以可持久化线段树的意思就是可以查询线段树的历史节点就是可持久化了。 如何实现可持久化? 我们这边先给出一棵线段树吧。 画的不好,大家理解一下就行了 假设说我现在想要单点修改最左边的叶子节点 在这里插入图片描述

two_big_monkey的博客 2141

081、空间降噪(Spatial Denoise)实战:双边滤波、非局部均值与BM3D在ISP中的调优

调参时,别只看PSNR/SSIM。找几个典型场景(夜景、人像、文字、天空),在真实设备上肉眼对比。我见过PSNR涨了2dB但图像看起来更差的案例——因为PSNR不惩罚纹理丢失。空间降噪这块,理论说再多,不如动手调一次。下次遇到噪点问题,先别急着上BM3D,试试双边滤波的自适应参数,说不定有惊喜。

zzfmlxs的博客 45

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

主席树

抛出问题 给定\(N\)个数(\(int\)范围内),一共\(M\)次询问,每次都要询问区间\([l,r]\)的第\(k\)大的数。 其中\(N,M,l,r\)均不超过\(2\times 10^5\),保证询问有答案。 点我去模板题 解决问题 暴力法 显而易见,最暴力的办法就是区间排序然后输出排序后第\(k\)个数。最坏情况的时间复杂度是\(O(nm\lg n)\),不超时才怪。 主席树...

GKX328131442的博客 601

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

树状结构之主席树

主席树搞了一个多星期TAT,,,,,,也只是大致领悟而已!!! 主席树又称函数式线段树,顾名思义,也就是通过函数来实现的线段树,至于为什么叫主席树,那是因为是fotile主席创建出来的这个数据结构(其实貌似是当初主席不会划分树而自己想出来的另一个处理方式。。。。是不是很吊呢? ORZ...)不扯了,切入正题。 主席树就是利用函数式编程的思想来使线段树支持询问历史版本、同时充分利用它们之间的共同...

weixin_30349597的博客 554

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

主席树入门详解

简介 主席树全称应为可持久化权值线段树,可用于解决区间第k小问题。但可能由于这个的影响力比较大,现在主席树也被泛指为可持久化线段树。 主席树树是由NOI选手黄嘉泰(HJT,咱也不敢说)首先使用的。黄嘉泰原话:“这种求k 大的方法(函数式线段树)应该是我最早开始用的”。 可持久化线段树 可持久化数据结构 (Persistent data structure) 是可以保留每一个历史版本,并且支持操作的不可变特性 (immutable)。 可持久化线段树即保留多个历史版本(第k个版本即第k次修改后,第k+1次版本

SCUEC__zhazhahui的博客 1348

IDA*学习笔记-HDU1667 The Rotation Game

以HDU1667为例,记录了IDA*的学习心得,终点提到A*构造的思路和原则

ex_voda的博客 291

详解——主席树

由来 主席树又称函数式线段树,顾名思义,也就是通过函数来实现的线段树 然而我并不知道什么是函数式线段树,某位大爷说:“主席树与可持...

weixin_30657541的博客 388

hdu 1667(IDA*)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1667 思路:大牛说是IDA*的入门题=.=构造h()=8-max(1,2,3);  max(1,2,3)表示中间的八个位置中出现最多的数的个数。 因为每次操作只能改变中间8个中的一个,所以可以这样构造启发式函数。 1 #include&lt;iostream&gt; 2 #inc...

weixin_34113237的博客 198

旋转游戏(The Rotation Game,, UVa1343)迭代加深搜索

题目:https://vjudge.net/problem/UVA-1343 结构实现技巧:用数组直接记录相应位置的下标,从而减少了每次赋值给相应数组。 #include &lt;iostream&gt; using namespace std; int a[24],maxd; int line[8][7]={ { 0, 2, 6,11,15,20,22}, // A { 1, 3,...

Nicolas的博客 448

高精度计算2的n次幂

#include&lt;iostream&gt; #include&lt;cstring&gt; #include&lt;cstdio&gt; #include&lt;string&gt; #include&lt;vector&gt; #include&lt;cstdlib&gt; #include&lt;algorithm&gt; using namespace std; char a[1005

hxs的博客 2970

HDU-1667 The Rotation Game(IDA*)

题意 https://www.luogu.org/problemnew/show/UVA1343 思路 首先枚举终态是 1,2,31,2,31,2,3 中的哪一个,然后再把 242424 个数字压成一个长度为 242424 的 010101 串(111 表示终态的数字),直接用 int\text{int}int 来表示这个数。 可以先打表出每一个操作,转动了哪些位置,然后就可以很快的挪动这个010...

Paulliant的博客 457

POJ 2104 K-th Number(主席树,区间第K大的数)

Description You are working for Macrohard company in data structures department. After failing your previous task about key insertion you were asked to write a new data structure that would be able t...

第一楼主的博客 479
上一篇: Openjudge 6048泰国佛塔(dfs)
下一篇: Openjudge187 炮兵阵地(dp)
GKHack
博客等级 码龄11年 48粉丝 291原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值