特殊的二阶魔方(魔方模型)

特殊的二阶魔方

时限: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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值