vijos 1016 北京2008的挂钟
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
样例输出1
4 5 8 9
限制
各个测试点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; }
以上是关于vijos 1016 北京2008的挂钟的主要内容,如果未能解决你的问题,请参考以下文章
Vijos P1496 火柴棒等式 NOIP2008提高组第二题