• Hdu-5983 2016ACM/ICPC亚洲区青岛站 B.Pocket Cube 模拟


    题面

    题意:给你一个2*2的魔方,给你每个面每个小块的颜色,一共24个,然后问你能否在一步之内还原.

    题解:手动在纸上画,推出每种变化对应的置换,显然,一共有6种,而且可以当成3种,(具体哪3种,就是绕x,y,z轴转一次的),另外一个方向,就是转三次就行了

            而且你也不需要考虑什么上面转了下面转,相对关系是一样的

            写的时候犯了个错,手写的u,v,r分不清楚了.....

            转一次会有12个小面发生变化,写的时候可以只写8个面,因为有一个面的位置变了,

            但是我们只问一步之内能不能还原,那一面的都没有到其他面,所以不影响也就是我注释部分,

       记得一进来就判这个魔方是不是已经是还原好的.

      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 int T,f,a[25],b[25],x[25];
      4 int ok()
      5 {
      6     for (int i=2;i<=4;i++) if (x[i]!=x[1]) return 0;
      7     for (int i=6;i<=8;i++) if (x[i]!=x[5]) return 0;
      8     for (int i=10;i<=12;i++) if (x[i]!=x[9]) return 0;
      9     for (int i=14;i<=16;i++) if (x[i]!=x[13]) return 0;
     10     for (int i=18;i<=20;i++) if (x[i]!=x[17]) return 0;
     11     for (int i=22;i<=24;i++) if (x[i]!=x[21]) return 0;
     12     return 1;
     13 }
     14 int okk()
     15 {
     16     for (int i=2;i<=4;i++) if (b[i]!=b[1]) return 0;
     17     for (int i=6;i<=8;i++) if (b[i]!=b[5]) return 0;
     18     for (int i=10;i<=12;i++) if (b[i]!=b[9]) return 0;
     19     for (int i=14;i<=16;i++) if (b[i]!=b[13]) return 0;
     20     for (int i=18;i<=20;i++) if (b[i]!=b[17]) return 0;
     21     for (int i=22;i<=24;i++) if (b[i]!=b[21]) return 0;
     22     return 1;
     23 }
     24 void z1()
     25 {
     26     /*x[2]=a[1];
     27     x[4]=a[2];
     28     x[1]=a[3];
     29     x[3]=a[4];*/
     30     x[20]=a[6];
     31     x[18]=a[5];
     32     x[5]=a[23];
     33     x[6]=a[21];
     34     x[21]=a[15];
     35     x[23]=a[16];
     36     x[16]=a[18];
     37     x[15]=a[20];    
     38 }
     39 void z2()
     40 {
     41     /*x[21]=a[23];
     42     x[23]=a[24];    
     43     x[22]=a[21];
     44     x[24]=a[22];*/    
     45     x[14]=a[2];
     46     x[16]=a[4];
     47     x[10]=a[14];
     48     x[12]=a[16];
     49     x[2]=a[6];
     50     x[4]=a[8];
     51     x[8]=a[12];
     52     x[6]=a[10];    
     53 }
     54 void z3()
     55 {
     56     /*x[5]=a[6];
     57     x[6]=a[8];
     58     x[7]=a[5];
     59     x[8]=a[7];*/    
     60     x[20]=a[4];
     61     x[19]=a[3];
     62     x[9]=a[20];
     63     x[10]=a[19];
     64     x[3]=a[23];
     65     x[4]=a[24];
     66     x[24]=a[9];
     67     x[23]=a[10];    
     68 }
     69 int ok1()
     70 {
     71     for (int i=1;i<=24;i++) a[i]=b[i];
     72     for (int i=1;i<=24;i++) x[i]=a[i];
     73     z1();
     74     if (ok()) return 1;
     75     for (int i=1;i<=24;i++) a[i]=x[i];
     76     z1();
     77     for (int i=1;i<=24;i++) a[i]=x[i];
     78     z1();
     79     if (ok()) return 1;
     80     return 0;
     81 }
     82 int ok2()
     83 {
     84     for (int i=1;i<=24;i++) a[i]=b[i];
     85     for (int i=1;i<=24;i++) x[i]=a[i];
     86     z2();
     87     if (ok()) return 1;
     88     for (int i=1;i<=24;i++) a[i]=x[i];
     89     z2();
     90     for (int i=1;i<=24;i++) a[i]=x[i];
     91     z2();
     92     if (ok()) return 1;
     93     return 0;
     94 }
     95 int ok3()
     96 {
     97     for (int i=1;i<=24;i++) a[i]=b[i];
     98     for (int i=1;i<=24;i++) x[i]=a[i];
     99     z3();
    100     if (ok()) return 1;
    101     for (int i=1;i<=24;i++) a[i]=x[i];
    102     z3();
    103     for (int i=1;i<=24;i++) a[i]=x[i];
    104     z3();
    105     if (ok()) return 1;
    106     return 0;
    107 }
    108 int main()
    109 {
    110     scanf("%d",&T);
    111     while (T--)
    112     {
    113         f=0;
    114         for (int i=1;i<=24;i++) scanf("%d",&b[i]);
    115         if (okk()) f=1;
    116         if (f==0) if (ok1()) f=1;
    117         if (f==0) if (ok2()) f=1;
    118         if (f==0) if (ok3()) f=1;
    119         if (f==1) puts("YES");else puts("NO");
    120     }
    121     return 0;
    122 }
  • 相关阅读:
    [转]为Ubuntu Server安装gnome图形桌面环境
    [转]ubuntu 安装五笔输入法
    [转]更改文件所有者
    QT 透明设置
    ubuntu 交叉编译arm linux 内核
    Opencv vs 2005编译
    [转]在skyeye中运行uboot
    object的引用 与 foreach的使用
    音频和视频
    HTML5 Canvas API
  • 原文地址:https://www.cnblogs.com/qywhy/p/9741068.html
Copyright © 2020-2023  润新知