2016ACM/ICPC亚洲区青岛站 B Hdu-5983 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 }

原文地址:https://www.cnblogs.com/qywhy/p/9741068.html

时间: 2024-07-30 12:37:06

2016ACM/ICPC亚洲区青岛站 B Hdu-5983 Pocket Cube 模拟的相关文章

2016ACM/ICPC亚洲区青岛站 Coding Contest 费用流

目录 2016ACM/ICPC亚洲区青岛站 Coding Contest 费用流 题目描述 题意(博主的鬼畜翻译): 分析: 代码 2016ACM/ICPC亚洲区青岛站 Coding Contest 费用流 题目描述 题目描述 A coding contest will be held in this university, in a huge playground. The whole playground would be divided into N blocks, and there w

HDU 5976 Detachment 【贪心】 (2016ACM/ICPC亚洲区大连站)

Detachment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 570    Accepted Submission(s): 192 Problem Description In a highly developed alien society, the habitats are almost infinite dimensiona

HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)

Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 249    Accepted Submission(s): 140 Problem Description Farmer John likes to play mathematics games with his N cows. Recently, t

2016 ACM/ICPC亚洲区青岛站现场赛(部分题解)

摘要 本文主要列举并求解了2016 ACM/ICPC亚洲区青岛站现场赛的部分真题,着重介绍了各个题目的解题思路,结合详细的AC代码,意在熟悉青岛赛区的出题策略,以备战2018青岛站现场赛. HDU 5984 Pocky 题意 给出一根棒子(可以吃的)的长度x和切割过程中不能小于的长度d,每次随机的选取一个位置切开,吃掉左边的一半,对右边的棒子同样操作,直至剩余的长度不大于d时停止.现在给出x和d,问切割次数的数学期望是多少. 解题思路 当看到第二个样例2 1时,结果是1.693147,联想到ln

HDU 5950 - Recursive sequence - [矩阵快速幂加速递推][2016ACM/ICPC亚洲区沈阳站 Problem C]

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 Farmer John likes to play mathematics games with his N cows. Recently, they are attracted by recursive sequences. In each turn, the cows would stand in a line, while John writes two positive numbers

HDU 5954 - Do not pour out - [积分+二分][2016ACM/ICPC亚洲区沈阳站 Problem G]

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5954 Problem DescriptionYou have got a cylindrical cup. Its bottom diameter is 2 units and its height is 2 units as well.The height of liquid level in the cup is d (0 ≤ d ≤ 2). When you incline the cup t

2016ACM/ICPC亚洲区大连站-重现赛

题目链接:http://acm.hdu.edu.cn/search.php?field=problem&key=2016ACM%2FICPC%D1%C7%D6%DE%C7%F8%B4%F3%C1%AC%D5%BE-%D6%D8%CF%D6%C8%FC%A3%A8%B8%D0%D0%BB%B4%F3%C1%AC%BA%A3%CA%C2%B4%F3%D1%A7%A3%A9&source=1&searchmode=source A.染色乱搞. 1 #include <bits/st

2016ACM/ICPC亚洲区沈阳站-重现赛

C.Recursive sequence 求ans(x),ans(1)=a,ans(2)=b,ans(n)=ans(n-2)*2+ans(n-1)+n^4 如果直接就去解...很难,毕竟不是那种可以直接化成矩阵的格式,我们也因为这个被卡很长时间 事实上可以把这道式子化成几个基本元素的格式,然后就容易组合了,比如ans(n-2)*2+ans(n-1)+(n-1)^4+4*(n-1)^3+6*(n-1)^2+4*(n-1)^1+1 包含了所有的基本组成形式,化绝对为相对,并且除了一个n-2其他都是n

2016ACM/ICPC亚洲区大连站-重现赛(感谢大连海事大学)(6/10)

1001题意:n个人,给m对敌对关系,X个好人,Y个坏人.现在问你是否每个人都是要么是好人,要么是坏人. 先看看与X,Y个人有联通的人是否有矛盾,没有矛盾的话咋就继续遍历那些不确定的人关系,随便取一个数3,与其相连的就是4,间隔就要相同,dfs搜过去就可以判断了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define