vijos 1016 北京2008的挂钟

北京2008的挂钟

描述

在2008北京奥运会雄伟的主会场的墙上,挂着如上图所示的3*3的九个挂钟(一开始指针即时针指向的位置请根据输入数据调整)。然而此次奥运会给与了大家一个机会,去用最少的移动操作改变上面的挂钟的时间全部为12点正(我们只考虑时针)。然而每一次操作并不是任意的,我们必须按照下面给出的列表对于挂钟进行改变。每一次操作我们给而且必须给指定的操作挂钟进行,每一个挂钟顺时针转动90度。列表如下:

操作 指定的操作挂钟
1 ABDE
2 ABC
3 BCEF
4 ADG
5 BDEFH
6 CFI
7 DEGH
8 GHI
9 EFHI

格式

输入格式

你的程序按照标准的3*3格式读入,一共9个0-3的数。0代表12点,1代表3点,2代表6点,3代表9点。

Your program is to read from standard input. Nine numbers give the start positions of the dials. 0=12 o‘clock, 1=3 o‘clock, 2=6 o‘clock, 3=9 o‘clock.

输出格式

你的程序需要写出标准的输出。输出一个最短的能够使所有挂钟指向12点的移动操作序列,中间以空格隔开,最后有空格,加回车。这一条最短操作需要是所有最短操作中最小的,也就是说选择最小的第一个操作数,如果第一个操作数相等,那么选择最小的第二个操作数……以此类推。值得肯定的是,这一条操作序列是唯一的。

Your program is to write to standard output. Output a shortest sorted sequence of moves (numbers), which returns all the dials to 12 o‘clock. You are convinced that the answer is unique.

样例1

样例输入1

3 3 0
2 2 2
2 1 2

Copy

样例输出1

4 5 8 9

Copy

限制

各个测试点1s

提示

Description


(Figure 1)

There are nine clocks in a 3*3 array (figure 1). The goal is to return all the dials to 12 o‘clock with as few moves as possible. There are nine different allowed ways to turn the dials on the clocks. Each such way is called a move. Select for each move a number 1 to 9. That number will turn the dials 90‘ (degrees) clockwise on those clocks which are affected according to figure 2 below.

Move Affected clocks

1 ABDE
2 ABC
3 BCEF
4 ADG
5 BDEFH
6 CFI
7 DEGH
8 GHI
9 EFHI

(Figure 2)

Input 
Your program is to read from standard input. Nine numbers give the start positions of the dials. 0=12 o‘clock, 1=3 o‘clock, 2=6 o‘clock, 3=9 o‘clock.

Output 
Your program is to write to standard output. Output a shortest sorted sequence of moves (numbers), which returns all the dials to 12 o‘clock. You are convinced that the answer is unique.

来源

Vivian Snow
IOI 1994 The Clocks, From PKU 1166

优先队列优化的bfs.

喜闻乐见的Code

#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
const int op[10][10]={{0},
					  {1,2,4,5},
					  {1,2,3},
					  {2,3,5,6},
					  {1,4,7},
					  {2,4,5,6,8},
					  {3,6,9},
					  {4,5,7,8},
					  {7,8,9},
					  {5,6,8,9}};
bool v[4][4][4][4][4][4][4][4][4]={0};
struct Clock {
	int t[10],st,o[100];
	bool operator < (const Clock &b)const {
		return st>b.st;
	}
}s;
void bfs() {
	priority_queue<Clock>Q;
	v[s.t[1]][s.t[2]][s.t[3]][s.t[4]][s.t[5]][s.t[6]][s.t[7]][s.t[8]][s.t[9]]=1;
	s.st=0;Q.push(s);
	while(!Q.empty()) {
		Clock T=Q.top();Q.pop();
		for(int i=1;i<=9;i++) {		//9种操作;
			int sum=0;s=T;
			for(int j=0;op[i][j];j++) {
				s.t[op[i][j]]++;
				s.t[op[i][j]]%=4;
			}
			if(v[s.t[1]][s.t[2]][s.t[3]][s.t[4]][s.t[5]][s.t[6]][s.t[7]][s.t[8]][s.t[9]]) continue;
			v[s.t[1]][s.t[2]][s.t[3]][s.t[4]][s.t[5]][s.t[6]][s.t[7]][s.t[8]][s.t[9]]=1;
			s.o[++s.st]=i;Q.push(s);
			if(s.t[1]||s.t[2]||s.t[3]||s.t[4]||s.t[5]||s.t[6]||s.t[7]||s.t[8]||s.t[9]) continue;
			sort(s.o+1,s.o+s.st+1);
			for(int j=1;j<=s.st;j++)
				printf("%d ",s.o[j]);
			return;
		}
	}
}
int main() {
	for(int i=1;i<=9;i++) scanf("%d",&s.t[i]);
	bfs();
	return 0;
}

  

时间: 2024-10-11 11:57:44

vijos 1016 北京2008的挂钟的相关文章

Vijos——T 1016 北京2008的挂钟 || 洛谷—— P1213 时钟

https://www.luogu.org/problem/show?pid=1213 题目描述 考虑将如此安排在一个 3 x 3 行列中的九个时钟: 目标要找一个最小的移动顺序将所有的指针指向12点.下面原表格列出了9种不同的旋转指针的方法,每一种方法都叫一次移动.选择1到9号移动方法,将会使在表格中对应的时钟的指针顺时针旋转90度. 移动方法 受影响的时钟 1 ABDE 2 ABC 3 BCEF 4 ADG 5 BDEFH 6 CFI 7 DEGH 8 GHI 9 EFHI Example

IOI1994 北京2008的挂钟 迭代加深

总的来讲,这是一道很⑨的题,因为: (1)题目中有⑨个挂钟 (2)有⑨种操作方案 (3)这题因为解空间太小所以可以直接⑨重循环!! 这题可以用迭代加深搜索高效求解,剪枝的策略也很显然: >所求的操作序列一定是单调不递减的 >同一操作不可能在解中出现4次及以上(操作4次等于没有操作) 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 using namespace s

距离北京奥运还有359天,发布WPF版本的北京2008标志(下)

原文:距离北京奥运还有359天,发布WPF版本的北京2008标志(下) 图片显示效果:? XAML代码: <Viewbox Width="463.548828" Height="370.816895"? xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"? xmlns:x="http://schemas.microsoft.com/winfx/2006

BZOJ 1016 JSOI 2008 最小生成树计数 Kruskal+搜索

题目大意:给出一些边,求出一共能形成多少个最小生成树. 思路:最小生成树有非常多定理啊,我也不是非常明确.这里仅仅简单讲讲做法.关于定各种定理请看这里:http://blog.csdn.net/wyfcyx_forever/article/details/40182739 我们先做一次最小生成树.然后记录每一种长度的边有多少在最小生成树中,然后从小到大搜索,看每一种边权有多少种放法.然后全部的都算出来累乘就是终于的结果. CODE: #include <map> #include <cs

PS教程1000例

http://www.missyuan.com/thread-446934-1-1.html Photoshop绘制逼真头发发丝效果http://www.missyuan.com/thread-446912-1-1.html Photoshop合成在空中漂移的陆地http://www.missyuan.com/thread-446909-1-1.html Photoshop制作漂亮的紫色水晶字效果http://www.missyuan.com/thread-446908-1-1.html Pho

把100%才华和精力直接放在赚钱这个目标上

工作也挺久了,不断的学习这编程知识,发现过一段时间后又失去目标,不断的思考,我们是该把精力放在学习技术上还是把直接把才华和精力放在赚钱这个目标上? 发现其实两者并不直接冲突,把控自己的财富观,保持对机会的嗅觉,顺势而为. 我有位理财很厉害的朋友,在北京2008年前就买入了7.8套房,以至于到了2008年之后,房价猛涨的情况下,他把其中几套房子租出去,每月收到的房租竟然几倍于他已经不菲的工资.那会闲聊,便说:想发财不能靠工作. 工作这么几年,因为工作的性质,看很多企业,接触很多企业家,于是很多时候

互联网技术

互联网技术定义:互联网技术指在计算机技术的基础上开发建立的一种信息技术(Information Technology 简称 IT) 直译 internet Technology 简称 IT 概念范围 第一层是硬件,主要指数据存储.处理和传输的主机和网络通信设备: 第二层是指软件,包括可用来搜集.存储.检索.分析.应用.评估信息的各种软件,它包括我们通常所指的ERP(企业资源计划).CRM(客户关系管理).SCM(供应链管理)等商用管理软件,也包括用来加强流程管理的WF(工作流)管理软件.辅助分析

【转】汪峰站在浪潮上 | 长报道

被质疑过度商业化的汪峰这一次索性把自己丢到了商业舞台的最中央. 汪峰和fiil耳机团队,fiil耳机CTO邬宁(前排左一),fiil耳机CEO彭锦洲(前排左三) 文:孔明明 图:尹夕远 编辑:汪再兴 女工陈春华 一个耳机出厂需要70道工序,它们又被分为五大部分:来料检查.PCBA(Printed Circuit Board +Assembly的简称,意为测试电路板的关键参数和性能).前加工.成品组装+测试.包装出货.38岁的女工陈春华,已经在这个位于苏州的耳机生产工厂工作了10年. 她作息规律,

java笔记整理

Java 笔记整理 包含内容     Unix Java 基础, 数据库(Oracle jdbc Hibernate pl/sql), web, JSP, Struts, Ajax Spring, Ejb, java和模式 Linux/Unix笔记 inode :存储编号(地址) ls -k:查看磁盘分区 ls -li:显示当前文件的inode号. 目录的大小跟文件的大小有关,跟目录里的文件(目录)数量无关. 一行多个命令的话,中间用分号分开.如:pwd;cal;date last | grep