P1213 时钟

Posted hrj1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1213 时钟相关的知识,希望对你有一定的参考价值。

题目描述

考虑将如此安排在一个 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

技术图片

[但这可能不是正确的方法,请看下面]

输入格式

第1-3行: 三个空格分开的数字,每个数字表示一个时钟的初始时间,3,6,9,12。数字的含意和上面第一个例子一样。

输出格式

单独的一行包括一个用空格分开的将所有指针指向12:00的最短移动顺序的列表。

如果有多种方案,输出那种使其连接起来数字最小的方案。(举例来说5 2 4 6 < 9 3 1 1)。

输入输出样例

输入 #1
9 9 12
6 6 6
6 3 6 
输出 #1
4 5 8 9

说明/提示

题目翻译来自NOCOW。

USACO Training Section 1.4

 

我说它是暴力枚举,你信吗。。。。。。

 

#include <bits/stdc++.h>
using namespace std;
struct node
    int state[9];
    string ans;
;
const bool movement[9][9] = 

  1,1,0,1,1,0,0,0,0,
  1,1,1,0,0,0,0,0,0,
  0,1,1,0,1,1,0,0,0,
  1,0,0,1,0,0,1,0,0,
  0,1,0,1,1,1,0,1,0,
  0,0,1,0,0,1,0,0,1,
  0,0,0,1,1,0,1,1,0,
  0,0,0,0,0,0,1,1,1,
  0,0,0,0,1,1,0,1,1
;
int state[9];
inline bool checkOK(int state[])
    for(int i=0;i<9;i++)
        if(state[i] != 4) return false;
    
    return true;

string ans = "";
bool vis[5][5][5][5][5][5][5][5][5];
queue<node> q;
void bfs()
    node tt;
    for(int j=0;j<9;j++)
        tt.state[j] = state[j];
    
    tt.ans = "";
    q.push(tt);
    while(!q.empty())
        node now = q.front();
        q.pop();
        if(checkOK(now.state))
            ans = now.ans;
            return;
        
        for(int i=0;i<9;i++)
            node nextn=now;
            for(int k=0;k<9;k++)
                nextn.state[k]=(nextn.state[k]+movement[i][k])%5;
                if(nextn.state[k] == 0) nextn.state[k] = 1;
            
            nextn.ans += (char)(0+i+1);
            if(!vis[nextn.state[0]][nextn.state[1]][nextn.state[2]][nextn.state[3]][nextn.state[4]][nextn.state[5]][nextn.state[6]][nextn.state[7]][nextn.state[8]])
                q.push(nextn);
                vis[nextn.state[0]][nextn.state[1]][nextn.state[2]][nextn.state[3]][nextn.state[4]][nextn.state[5]][nextn.state[6]][nextn.state[7]][nextn.state[8]] = true;
            
        
    

int main()
    ios::sync_with_stdio(false);
    cin.tie(0);
    for(int i=0;i<9;i++)
        int time;
        cin>>time;
        state[i] = time / 3;
    
    memset(vis,false,sizeof vis);
    bfs();
    for(int i=0;i<ans.size();i++)
        if(i == 0)
            cout << ans[i];
        else
            cout << " " << ans[i];
        
    
    return 0;

 

以上是关于P1213 时钟的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P1213 时钟 &&IOI 1994 The Clocks

实时时钟系统时钟和主机服务器时钟的区别

Linux: 硬件时钟, 系统时钟, 网络时钟, 时区修改和同步

Linux: 硬件时钟, 系统时钟, 网络时钟, 时区修改和同步

Linux: 硬件时钟, 系统时钟, 网络时钟, 时区修改和同步

分布式系统概念 | 分布式时钟:物理时钟逻辑时钟Lamport 时间戳向量时钟版本向量