洛谷P1213 [USACO1.4][IOI1994]时钟 The Clocks

这是一个暴力枚举题

有两种解决方法,第一种用九重for循环(有点麻烦,尽量别用),第二种简化版(虽然行数少了,但难理解),先来看看


 

题目!!!

题目描述

考虑将如此安排在一个 3*3 行列中的九个时钟:

目标要找一个最小的移动顺序将所有的指针指向 12点。下面原表格列出了 9 种不同的旋转指针的方法,每一种方法都叫一次移动。
选择 19 号移动方法,将会使在表格中对应的时钟的指针顺时针旋转 90度

移动方法受影响的时钟
1 ABDE
2 ABC
3 BCEF
4 ADG
5 BDEFH
6 CFI
7 DEGH
8 GHI
9 EFHI

通过这个表格,我们可以做一个演示图来加深理解

输入格式

输入三行,每行三个正整数,表示一个时钟的初始时间,数字的含意和上面第一个例子一样。

输出格式

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

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

输入输出样例

输入 #1
  9 9 12
  6 6 6 
    6 3 6 
输出 #1
 4 5 8 9
下面,上代码~~~~~~~~

#include<bits/stdc++.h>
using namespace std;
int q[10000],a[100];
int main(){
  for(int i=1;i<=9;i++){
  cin>>a[i];
  a[i]=a[i]/3;
  }
  for(int k=0;k<=3;k++)
    for(int b=0;b<=3;b++)
      for(int c=0;c<=3;c++)
        for(int d=0;d<=3;d++)
          for(int e=0;e<=3;e++)
            for(int f=0;f<=3;f++)
              for(int g=0;g<=3;g++)
                for(int h=0;h<=3;h++)
                  for(int i=0;i<=3;i++)
                    if((k+b+d)%4==(4-a[1])%4 and (k+b+c+e)%4==(4-a[2])%4 and (b+c+f)%4==(4-a[3])%4 and (k+d+e+g)%4==(4-a[4])%4 and (k+c+e+g+i)%4==(4-a[5])%4                                                                                             and (c+e+f+i)%4==(4-a[6])%4 and (d+g+h)%4==(4-a[7])%4 and (e+g+h+i)%4==(4-a[8])%4 and
                     (f+h+i)%4==(4-a[9])%4){
                       q[1]=k,q[2]=b,q[3]=c,q[4]=d,q[5]=e,q[6]=f,q[7]=g,q[8]=h,q[9]=i;
                       for(int i=1;i<=9;i++)
                         if(q[i]>0){
                           for(int j=1;j<=q[i];j++){
                             cout<<i<<" ";
                            }
                          }
                        }
  return 0;
}

这看似杂乱无章的代码,其实很简单,这不过是把初始时间挨个算出来,然后输出。

不得不说,是真的丑!!!!!

再来看看化简代码(你们自己写吧,我就不献丑了)

再回

886~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

最后叭叭几句(不会上网自己查吧)

 

posted @ 2023-03-04 22:44  intelzsy  阅读(158)  评论(1)    收藏  举报