题意是说给定一个 2*2 魔方的各个面的情况,问是否能转动不超过一次使得魔方复原。

思路是先在输入的时候统计一下已完成的面数,要想以最多一次的转动使得魔方复原,那么已完成的面数只能是 2 面或者 6 面,此处可剪枝。

若已完成 6 面,那么一定可以复原;

若已完成 2 面,则要用一次转动完成其他六面,开始这里打算用结构体去存,结果在判断的时候自己混乱了……最终直接定了 24 个变量,a,b,c……w,x,

手动做了个小正方体,太丢人……(但不得不说这种方法挺好的,易于理解,而且不会乱^_^)

代码如下:

 #include <bits/stdc++.h>
using namespace std;
int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x;
bool xu[];
int main()
{
int times,cnt;
bool wu;
scanf("%d",&times);
while(times--)
{
cnt = ;
memset(xu,,sizeof(xu));
scanf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f,&g,&h,&i,&j,&k,&l,&m,&n,&o,&p,&q,&r,&s,&t,&u,&v,&w,&x);
if(a==b&&b==c&&c==d)
{
++cnt;
xu[] = ;
}
if(e==f&&f==g&&g==h)
{
++cnt;
xu[] = ;
}
if(i==j&&j==k&&k==l)
{
++cnt;
xu[] = ;
}
if(m==n&&n==o&&o==p)
{
++cnt;
xu[] = ;
}
if(q==r&&r==s&&s==t)
{
++cnt;
xu[] = ;
}
if(u==v&&v==w&&w==x)
{
++cnt;
xu[] = ;
}
if(cnt==) puts("YES");
else if(cnt==)
{
wu = ;
if(xu[]&&xu[])
{
if(m==n&&m==u&&m==w)
{
if(v==x&&v==e&&v==f)
if(g==h&&g==r&&g==t)
if(q==s&&q==o&&q==p)
wu = ;
}
else if(m==n&&m==r&&m==t)
{
if(q==s&&q==e&&q==f)
if(g==h&&g==u&&g==w)
if(v==x&&v==o&&v==p)
wu = ;
}
}
else if(xu[] && xu[])
{
if(a==b&&a==w&&a==x)
{
if(u==v&&u==i&&u==j)
if(k==l&&k==s&&k==t)
if(q==r&&q==c&&q==d)
wu = ;
}
else if(a==b&&a==s&&a==t)
{
if(q==r&&q==i&&q==j)
if(k==l&&k==w&&k==x)
if(u==v&&u==c&&u==d)
wu = ;
}
}
else if(xu[] && xu[])
{
if(a==c&&a==n&&a==p)
{
if(m==o&&m==j&&m==l)
if(i==k&&i==f&&i==h)
if(e==g&&e==b&&e==d)
wu = ;
}
else if(a==c&&a==f&&a==h)
{
if(e==g&&e==j&&e==l)
if(i==k&&i==n&&i==p)
if(m==o&&m==b&&m==d)
wu = ;
}
}
if(wu) puts("YES");
else puts("NO");
}
else puts("NO");
}
return ;
}
05-11 20:49