zoukankan      html  css  js  c++  java
  • 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

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

    输入输出格式

    输入格式:

    第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

    搜索每次移动方案的使用次数、每次用原始时钟判断一次。、

    每次使用移动方法多余3时就转一圈没意义了。

     1 #include <algorithm>
     2 #include <cstring>
     3 #include <cstdio>
     4 
     5 int op[9][9]={{1,1,0,1,1,0,0,0,0},
     6               {1,1,1,0,0,0,0,0,0},
     7               {0,1,1,0,1,1,0,0,0},
     8               {1,0,0,1,0,0,1,0,0},
     9               {0,1,0,1,1,1,0,1,0},
    10               {0,0,1,0,0,1,0,0,1},
    11               {0,0,0,1,1,0,1,1,0},
    12               {0,0,0,0,0,0,1,1,1},
    13               {0,0,0,0,1,1,0,1,1}};
    14 int tmp[10],tim[10],cnt[10];
    15 
    16 inline void read(int &x)
    17 {
    18     x=0; register char ch=getchar();
    19     for(;ch>'9'||ch<'0';) ch=getchar();
    20     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
    21 }
    22 
    23 bool judge(int *a)
    24 {
    25     for(int i=0; i<9; ++i)
    26         if(a[i]) return 0;
    27     return true;
    28 }
    29 
    30 void DFS(int num)
    31 {
    32     memcpy(&tmp,&tim,sizeof(tim));
    33     for(int i=0; i<9; ++i)
    34         for(int j=0; j<9; ++j)
    35             tmp[i]=(tmp[i]+op[j][i]*cnt[j])%4;
    36     if(judge(tmp))
    37     {
    38         for(int i=0; i<9; ++i)
    39             for(int j=0; j<cnt[i]; ++j)
    40                 printf("%d ",i+1);
    41         std::exit(0) ;
    42     }
    43     if(num==9) return ;
    44     for(int i=0; i<4; ++i)
    45         cnt[num]=i,DFS(num+1);
    46 }
    47 
    48 int Aptal()
    49 {
    50     for(int i=0; i<9; ++i)
    51         read(tim[i]),tim[i]/=3,tim[i]%=4;
    52     DFS(0);
    53     return 0;
    54 }
    55 
    56 int Hope=Aptal();
    57 int main(){;}
    ——每当你想要放弃的时候,就想想是为了什么才一路坚持到现在。
  • 相关阅读:
    E
    CSU 1757 火车进站 1757
    [Unity游戏开发]场景切换
    相机跟随
    [Unity游戏开发]Vector3类
    [Unity游戏开发] 关于向量计算的一些基础
    [Unity游戏开发] MonoBehaviour类常用方法(脚本生命周期)
    C#学习笔记之——new在哪些地方用
    C#——快速排序
    C#学习笔记之——事件(Event)
  • 原文地址:https://www.cnblogs.com/Shy-key/p/7498907.html
Copyright © 2011-2022 走看看