usaco3.2.6魔板


#include <iostream>
#include <fstream>
using namespace std;
struct data{ int last,deep,opr,x;}q[100000];
bool use[8][8][8][8][8][8][8];
int main()
{
   
    int now[8],l=1,r=1,goal=0,k[3][8]={{4,5,6,7,0,1,2,3},{3,0,1,2,7,4,5,6},{0,5,1,3,4,6,2,7}};
    for (int i=0;i<=3;i++)
        cin>>now[i];
    for (int i=7;i>=4;i--)
        cin>>now[i];
    for (int i=0;i<=7;i++)
        goal=goal*10+now[i];
    q[1].deep=0;
    q[1].opr=-1;
    q[1].x=12348765;
    use[0][1][2][3][7][6][5]=true;
    q[1].last=0;
    if (q[1].x==goal){
                      cout<<0<<endl;
                      cout<<endl;
                      return 0;
                      }
    for (;;)
    {
        int tmp[8],x=q[l].x;
        for (int i=7;i>=0;i--)
        {
            tmp[i]=x%10;
            x/=10;
        }
        for (int i=0;i<3;i++)
        {
            int nn[8];
            for (int j=0;j<8;j++) nn[j]=tmp[k[i][j]];
            x=0;
            for (int j=0;j<8;j++) x=x*10+nn[j];
            if (!use[nn[0]-1][nn[1]-1][nn[2]-1][nn[3]-1][nn[4]-1][nn[5]-1][nn[6]-1]){
                         use[nn[0]-1][nn[1]-1][nn[2]-1][nn[3]-1][nn[4]-1][nn[5]-1][nn[6]-1]=true;
                         r++;
                         q[r].deep=q[l].deep+1;
                         q[r].x=x;
                         q[r].last=l;
                         q[r].opr=i;
                         if (x==goal) break;
                         }
        }
        l++;
        if (x==goal) break;
    }
    cout<<q[r].deep<<endl;
    int len=0,res[1000];
    while (q[r].opr>=0)
    {
          len++;
          res[len]=q[r].opr;
          r=q[r].last;
    }
    for (int i=len;i>=1;i--)
        cout<<(char)('A'+res[i]);
    cout<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值