传送门
我跟憨憨一样,,,读错题了,没看到很关键的那个只能转一次,然后写bfs写了半天,,,
思路:一共有12种转法,(其实只有六种,挨着的两层一个顺时针和另一个逆时针,出来的结果是一样的),那么只要找好转完之后哪些值变了就行了。可以用纸弄个立方体出来,,,
代码:
#include
#include
#include
#include
#include
#include
#include
using namespace std;
tr1::unordered_map<string,int> mpp;
int nex[15][30]={
{0,5,23,6,21,23,16,21,15,16,18,15,20,18,5,20,6},
{0,5,18,6,20,18,16,20,15,16,23,15,21,23,5,21,6},
{0,3,19,4,20,19,10,20,9,10,23,9,24,23,3,24,4},
{0,3,23,4,24,23,10,24,9,10,19,9,20,19,3,20,4},
{0,2,6,4,8,6,10,8,12,10,14,12,16,14,2,16,4},
{0,2,14,4,16,14,10,16,12,10,6,12,8,6,2,8,4},
};
bool check(string s)
{
for(int i=4;i<s.size();i+=4)
for(int j=i-1;j>=i-3;j--)
if(s[i]!=s[j])
return false;
return true;
}
bool solve(string s)
{
if(check(s))
return true;
for(int i=0;i<6;i++)
{
string ss=s;
for(int j=1;j<=15;j+=2)
{
int l=nex[i][j],r=nex[i][j+1];
ss[l]=s[r];
}
if(check(ss))
return true;
}
return false;
}
int main()
{
int t;
cin>>t;
while(t--)
{
map<int,int> mp;
int c=1;
string s(" ");
int k=1;
for(int i=0;i<6;i++)
for(int j=0;j<4;j++)
{
int x;
scanf("%d",&x);
x=mp[x]?mp[x]:mp[x]=c++;
s+=x+'0';
}
// cout<<s<<endl;
if(c>7)
{
printf("NO\n");
continue;
}
if(solve(s))
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}