zoukankan      html  css  js  c++  java
  • magic cube

    搜索题,

    每个状态能扩展出12种状态,最多进行5次旋转12^5

    要用到iddfs,或者我看到网上其他人用的ida*

    我也是参考了别人的代码,而且这个题vj上有点问题,我看数据看了半天,愣是没看明白第二个数据咋回事,后来才知道是vj显示的有问题

    #include<iostream>
    #include<queue>
    #include<cstring>
    #include<vector>
    #include<cstdio>
    #include<cmath>
    #include<map>
    #include<string>
    using namespace std;
    #define ll long long
    #define se second
    #define fi first
    #define oo 0x3fffffff
    /*
      4
    0 1 2 3
      5
    
               1  2  3
    //         4  5  6
    //         7  8  9
    //10 11 12 13 14 15 16 17 18 19 20 21
    //22 23 24 25 26 27 28 29 30 31 32 33
    //34 35 36 37 38 39 40 41 42 43 44 45
    //         46 47 48
    //         49 50 51
    //         52 53 54
    */
    int cent[7] = {23, 26, 29, 32, 5, 50};
    int face[7][10] = {
    {10,11,12,22,23,24,34,35,36},
    {13,14,15,25,26,27,37,38,39},
    {16,17,18,28,29,30,40,41,42},
    {19,20,21,31,32,33,43,44,45},
    {1,2,3,4,5,6,7,8,9},
    {46,47,48,49,50,51,52,53,54}
    };
    int change[12][23] = {
         {1,4,7,13,25,37,46,49,52,21,33,45,10,11,12,24,36,35,34,22},
         {45,33,21,1,4,7,13,25,37,52,49,46,34,22,10,11,12,24,36,35},
         {7,8,9,16,28,40,48,47,46,36,24,12,13,14,15,27,39,38,37,25},
         {36,24,12,7,8,9,16,28,40,48,47,46,37,25,13,14,15,27,39,38},
         {9,6,3,19,31,43,54,51,48,39,27,15,16,17,18,30,42,41,40,28},
         {39,27,15,9,6,3,19,31,43,54,51,48,40,28,16,17,18,30,42,41},
         {42,30,18,3,2,1,10,22,34,52,53,54,19,20,21,33,45,44,43,31},
         {52,53,54,42,30,18,3,2,1,10,22,34,43,31,19,20,21,33,45,44},
         {15,14,13,12,11,10,21,20,19,18,17,16,1,2,3,6,9,8,7,4},
         {18,17,16,15,14,13,12,11,10,21,20,19,7,4,1,2,3,6,9,8},
         {37,38,39,40,41,42,43,44,45,34,35,36,46,47,48,51,54,53,52,49},
         {34,35,36,37,38,39,40,41,42,43,44,45,52,49,46,47,48,51,54,53}
    };
    char s[60];
    int a[10],b[10];
    int maxdepth;
    int l = 0;
    bool dfs(int dep);
    bool judge();
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            l = 0;
            for(int i = 1;i <= 54; ++i)
                scanf(" %c",s+i);
            //for(int i = 1; i <= 54; ++i)
              //  printf("%c",s[i]);
            for(maxdepth = 1;maxdepth <= 5; ++maxdepth)
            {
                if(dfs(0))
                {
                    if(l == 0)
                    {
                        printf("0
    ");break;
                    }
                    printf("%d
    ", l);
                    for(int i = 0; i < l-1; ++i)
                    {
                        printf("%d %d ",a[i],b[i]);
                    }
                    printf("%d %d
    ",a[l-1],b[l-1]);
                    break;
                }
            }
            if(maxdepth == 6)
                printf("-1
    ");
        }
    }
    bool judge()
    {
        for(int i = 0; i < 6; ++i)
        {
            for(int j = 0; j < 9; ++j)
            {
                if(s[face[i][j]] != s[cent[i]])
                    return false;
            }
        }
        return true;
    }
    bool dfs(int dep)
    {
        if(judge())
        {
            l = dep;
            return true;
        }
        if(dep >= maxdepth)
            return false;
        char tmp[60];
        memcpy(tmp,s,sizeof s);
        for(int i = 0; i < 12; ++i)
        {
            for(int j = 0; j < 20; ++j)
            {
                s[change[i][j]] = tmp[change[i^1][j]];
            }
            /*if(dep == 0)
            {
                for(int i = 0; i < 6; ++i)
                for(int j = 0; j < 9; ++j)
                    printf("%c",s[face[i][j]]);
                cout << " " << (i&1) << endl;
                cout << endl;
            }*/
            a[dep] = i/2;
            b[dep] = i&1?-1:1;
            if(dfs(dep+1)) return true;
            memcpy(s,tmp,sizeof tmp);
        }
        return false;
    }
  • 相关阅读:
    [Luogu5042/UOJ #100][国家集训队互测2015]丢失的题面/ydc的题面
    [51nod1773]A国的贸易
    [GZOI2019&GXOI2019]省选GG记
    [51nod1659]数方块
    [51nod1052]最大M子段和
    [51nod1201]整数划分
    [51nod1084]矩阵取数问题 V2
    [51nod1020]逆序排列
    [BZOJ3000]Big Number
    [BZOJ1684][Usaco2005 Oct]Close Encounter
  • 原文地址:https://www.cnblogs.com/mltang/p/9762697.html
Copyright © 2011-2022 走看看