特殊的二阶魔方
时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
魔方大家应该都玩过。现在有一个特殊的二阶魔方,它只有一面是白色,其余五个面全是黑色。玩这个魔方当然也有特殊的规则,玩家只能通过六种方式去改变它,底层向左转一格(称为DL),底层向右转一格(称为DR),右侧向上转一格(称为RU),右侧向下转一格(称为RD),内侧顺时针转一格(称为C),内侧逆时针转一格(称为CC)。现给一魔方的状态,请在最少的步骤内把魔方还原
输入:
按照上下左右前后的顺序给出各面的具体情况,0表示白色,1表示黑色。上下、左右、前后分别是以俯视图、左视图、正视图看到的
输出:
输出令一面全为白色的最小步数。
输入样例:
00
00
11
11
11
11
11
11
11
11
11
11
输出样例:
0
来源:
#include <iostream>
#include <cstdio>
#include <queue>
#include <map>
using namespace std;
struct Node
{
char a[10],b[10],c[10];// 上下,左右,前后
int step;
}s;
map<string,int> s1; //状态的存储是一个整体性的,分开合的话可能会漏了情况
queue <Node> q;
int power(int xx,int yy)
{
int ans=1;
if(yy==0) return 1;
else
{
for(int i=1;i<=yy;i++)
ans*=xx;
}
return ans;
}
int cnt(Node si)
{
int i;
string num;
for(i=1;i<=8;i++)
num+=si.a[i];
for(i=1;i<=8;i++)
num+=si.b[i];
for(i=1;i<=8;i++)
num+=si.c[i];
if(s1[num]==0)
{
s1[num]=1;
return 1;
}
return 0;
}
void func1(Node si)
{
Node next;
next=si;
next.a[5]=si.a[7]; next.a[6]=si.a[5]; next.a[7]=si.a[8]; next.a[8]=si.a[6];
next.c[7]=si.b[4]; next.c[8]=si.b[3]; next.b[8]=si.c[8]; next.b[7]=si.c[7]; next.c[3]=si.b[8]; next.c[4]=si.b[7]; next.b[3]=si.c[3]; next.b[4]=si.c[4];
if(cnt(next))
{
next.step=si.step+1;
q.push(next);
}
return;
}
void func2(Node si)
{
Node next;
next=si;
next.a[5]=si.a[6]; next.a[6]=si.a[8]; next.a[7]=si.a[5]; next.a[8]=si.a[7];
next.b[4]=si.c[7]; next.b[3]=si.c[8]; next.c[3]=si.b[3]; next.c[4]=si.b[4]; next.b[8]=si.c[3]; next.b[7]=si.c[4]; next.c[7]=si.b[7]; next.c[8]=si.b[8];
if(cnt(next))
{
next.step=si.step+1;
q.push(next);
}
return;
}
void func3(Node si)
{
Node next;
next=si;
next.b[6]=si.b[8]; next.b[5]=si.b[6]; next.b[8]=si.b[7]; next.b[7]=si.b[5];
next.c[6]=si.a[4]; next.c[8]=si.a[2]; next.a[8]=si.c[8]; next.a[6]=si.c[6]; next.c[2]=si.a[8]; next.c[4]=si.a[6]; next.a[2]=si.c[2]; next.a[4]=si.c[4];
if(cnt(next))
{
next.step=si.step+1;
q.push(next);
}
return;
}
void func4(Node si)
{
Node next;
next=si;
next.b[6]=si.b[5]; next.b[5]=si.b[7]; next.b[8]=si.b[6]; next.b[7]=si.b[8];
next.c[2]=si.a[2]; next.c[4]=si.a[4]; next.a[6]=si.c[4]; next.a[8]=si.c[2]; next.c[6]=si.a[6]; next.c[8]=si.a[8]; next.a[4]=si.c[6]; next.a[2]=si.c[8];
if(cnt(next))
{
next.step=si.step+1;
q.push(next);
}
return;
}
void func5(Node si)
{
Node next;
next=si;
next.c[5]=si.c[7]; next.c[6]=si.c[5]; next.c[7]=si.c[8]; next.c[8]=si.c[6];
next.b[5]=si.a[1]; next.b[7]=si.a[2]; next.a[5]=si.b[7]; next.a[6]=si.b[5]; next.b[1]=si.a[5]; next.b[3]=si.a[6]; next.a[1]=si.b[3]; next.a[2]=si.b[1];
if(cnt(next))
{
next.step=si.step+1;
q.push(next);
}
return;
}
void func6(Node si)
{
Node next;
next=si;
next.c[5]=si.c[6]; next.c[6]=si.c[8]; next.c[7]=si.c[5]; next.c[8]=si.c[7];
next.b[1]=si.a[2]; next.b[3]=si.a[1]; next.a[5]=si.b[1]; next.a[6]=si.b[3]; next.b[5]=si.a[6]; next.b[7]=si.a[5]; next.a[1]=si.b[5]; next.a[2]=si.b[7];
if(cnt(next))
{
next.step=si.step+1;
q.push(next);
}
return;
}
void bfs()
{
int i;
q.push(s);
Node now;
while(!q.empty())
{
now=q.front();
q.pop();
if((now.a[1]=='0'&&now.a[2]=='0'&&now.a[3]=='0'&&now.a[4]=='0')||(now.a[5]=='0'&&now.a[6]=='0'&&now.a[7]=='0'&&now.a[8]=='0')
||(now.b[1]=='0'&&now.b[2]=='0'&&now.b[3]=='0'&&now.b[4]=='0')||(now.b[5]=='0'&&now.b[6]=='0'&&now.b[7]=='0'&&now.b[8]=='0')
||(now.c[1]=='0'&&now.c[2]=='0'&&now.c[3]=='0'&&now.c[4]=='0')||(now.c[5]=='0'&&now.c[6]=='0'&&now.c[7]=='0'&&now.c[8]=='0'))
{
printf("%d\n",now.step);
return;
}
for(i=1;i<=6;i++)
{
if(i==1) func1(now);
else if(i==2) func2(now);
else if(i==3) func3(now);
else if(i==4) func4(now);
else if(i==5) func5(now);
else if(i==6) func6(now);
}
}
printf("-1\n");
return ;
}
int main()
{
scanf("%c%c",&s.a[1],&s.a[2]);
getchar();
scanf("%c%c",&s.a[3],&s.a[4]);
getchar();
scanf("%c%c",&s.a[5],&s.a[6]);
getchar();
scanf("%c%c",&s.a[7],&s.a[8]);
getchar();
scanf("%c%c",&s.b[1],&s.b[2]);
getchar();
scanf("%c%c",&s.b[3],&s.b[4]);
getchar();
scanf("%c%c",&s.b[5],&s.b[6]);
getchar();
scanf("%c%c",&s.b[7],&s.b[8]);
getchar();
scanf("%c%c",&s.c[1],&s.c[2]);
getchar();
scanf("%c%c",&s.c[3],&s.c[4]);
getchar();
scanf("%c%c",&s.c[5],&s.c[6]);
getchar();
scanf("%c%c",&s.c[7],&s.c[8]);
s.step=0;
cnt(s);
bfs();
return 0;
}