一个魔方,在转动了四次之后,一个面最多可能出现多少种颜色,为什么?

来源:互联网 发布:linux ntp remote = 编辑:程序博客网 时间:2024/05/17 06:21

想法:保存6个数组,每个数组9个元素,A1,A2……,每次变动对其中的4到5个数据进行元素调换,得到四次变换后的新数组,统计其中含有5种元素的数组。每次变换有18种可能,耗时18^4

A1 A2 A3 A4 A5 A6 A7 A8 A9

C1 C2 C3 C4 C5 C6 C7 C8 C9

B1 B2 B3 B4 B5 B6 B7 B8 B9

D1 D2 D3 D4 D5 D6 D7 D8 D9

E1 E2 E3 E4 E5 E6 E7 E8 E9

F1 F2 F3 F4 F5 F6 F7 F8 F9

面排列

A1 A2 A3

A4 A5 A6

A7 A8 A9

 

魔方排列

上 B

左C     中A      右D

       下E

       背面F

正面A面每一种变换,都会针对其中的部分元素尽心换位,如横向顺时针切换时,

 

A4 A5 A6 -> C4 C5 C6 -> F4 F5 F6->D4 D5 D6->

其中切换是针对 数组下标的 

通过横竖切三层顺逆180度三个方面一共构造24种变换方式。

 

经过24^4 次变换后,统计A数组里包含A B C D E F不同种类的个数。

 

优化:对于A面,每一次变换后剔除,元素数量不变或减少的可能,提高时间效率。




#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>


int arr[6][9];


int (*turn(int cube[][9], int which))[9] {
    int (*ret)[9] = new int[6][9];
    memcpy(ret, cube, sizeof(arr));
    int temp0, temp1, temp2;
    switch (which) {
        // 顶1
        // 左2 中0 右4
        // 底3
        // 背5
        //         630
        //       顶741
        //         852
        //   012   012   876
        // 左345 中345 右543
        //   678   678   210
        //         258
        //       底147
        //         036
        //         876
        //       背543
        //         210
        /*  逆时针 
temp0 = ret[1][0];
temp1 = ret[1][1];
ret[1][0] = ret[1][2];
ret[1][1] = ret[1][5];
ret[1][2] = ret[1][8];
ret[1][5] = ret[1][7];
ret[1][8] = ret[1][6];
ret[1][7] = ret[1][3];
ret[1][6] = temp0;
ret[1][3] = temp1;*/
    case 1:// 顺时针旋转正面0面,周围逆时针1 2 3 4
        temp0 = ret[0][0];
        temp1 = ret[0][1];
        ret[0][0] = ret[0][6];
        ret[0][1] = ret[0][3];
        ret[0][6] = ret[0][8];
        ret[0][3] = ret[0][7];
        ret[0][8] = ret[0][2];
        ret[0][7] = ret[0][5];
        ret[0][2] = temp0;
        ret[0][5] = temp1;


        temp0 = ret[1][2];
        temp1 = ret[1][5];
        temp2 = ret[1][8];
        ret[1][2] = ret[2][2];
        ret[1][5] = ret[2][5];
        ret[1][8] = ret[2][8];
        ret[2][2] = ret[3][2];
        ret[2][5] = ret[3][5];
        ret[2][8] = ret[3][8];
        ret[3][2] = ret[4][2];
        ret[3][5] = ret[4][5];
        ret[3][8] = ret[4][8];
        ret[4][2] = temp0;
        ret[4][5] = temp1;
        ret[4][8] = temp2;


        break;
    case 2: // 顺时针旋转顶层1面,周围逆时针依次为2 0 4 5
        temp0 = ret[1][0];
        temp1 = ret[1][1];
        ret[1][0] = ret[1][6];
        ret[1][1] = ret[1][3];
        ret[1][6] = ret[1][8];
        ret[1][3] = ret[1][7];
        ret[1][8] = ret[1][2];
        ret[1][7] = ret[1][5];
        ret[1][2] = temp0;
        ret[1][5] = temp1;


        temp0 = ret[2][0];
        temp1 = ret[2][1];
        temp2 = ret[2][2];
        ret[2][0] = ret[0][0];
        ret[2][1] = ret[0][1];
        ret[2][2] = ret[0][2];
        ret[0][0] = ret[4][8];
        ret[0][1] = ret[4][7];
        ret[0][2] = ret[4][6];
        ret[4][8] = ret[5][0];
        ret[4][7] = ret[5][1];
        ret[4][6] = ret[5][2];
        ret[5][0] = temp0;
        ret[5][1] = temp1;
        ret[5][2] = temp2;


        break;


    case 3: // 顺时针旋转底层3面,周围逆时针依次为2 5 4 0
        temp0 = ret[3][0];
        temp1 = ret[3][1];
        ret[3][0] = ret[3][6];
        ret[3][1] = ret[3][3];
        ret[3][6] = ret[3][8];
        ret[3][3] = ret[3][7];
        ret[3][8] = ret[3][2];
        ret[3][7] = ret[3][5];
        ret[3][2] = temp0;
        ret[3][5] = temp1;


        temp0 = ret[2][6];
        temp1 = ret[2][7];
        temp2 = ret[2][8];
        ret[2][6] = ret[5][6];
        ret[2][7] = ret[5][7];
        ret[2][8] = ret[5][8];
        ret[5][6] = ret[4][2];
        ret[5][7] = ret[4][1];
        ret[5][8] = ret[4][0];
        ret[4][2] = ret[0][6];
        ret[4][1] = ret[0][7];
        ret[4][0] = ret[0][8];
        ret[0][6] = temp0;
        ret[0][7] = temp1;
        ret[0][8] = temp2;


        break;


    case 4: // 顺时针旋转左层2面,周围逆时针依次为1 5 3 0
        temp0 = ret[2][0];
        temp1 = ret[2][1];
        ret[2][0] = ret[2][6];
        ret[2][1] = ret[2][3];
        ret[2][6] = ret[2][8];
        ret[2][3] = ret[2][7];
        ret[2][8] = ret[2][2];
        ret[2][7] = ret[2][5];
        ret[2][2] = temp0;
        ret[2][5] = temp1;


        temp0 = ret[1][6];
        temp1 = ret[1][7];
        temp2 = ret[1][8];
        ret[1][6] = ret[5][8];
        ret[1][7] = ret[5][5];
        ret[1][8] = ret[5][2];
        ret[5][8] = ret[3][2];
        ret[5][5] = ret[3][1];
        ret[5][2] = ret[3][0];
        ret[3][2] = ret[0][0];
        ret[3][1] = ret[0][3];
        ret[3][0] = ret[0][6];
        ret[0][0] = temp0;
        ret[0][3] = temp1;
        ret[0][6] = temp2;


        break;


    case 5: // 顺时针旋转右层4面,周围逆时针依次为1 0 3 5
        temp0 = ret[4][0];
        temp1 = ret[4][1];
        ret[4][0] = ret[4][6];
        ret[4][1] = ret[4][3];
        ret[4][6] = ret[4][8];
        ret[4][3] = ret[4][7];
        ret[4][8] = ret[4][2];
        ret[4][7] = ret[4][5];
        ret[4][2] = temp0;
        ret[4][5] = temp1;


        temp0 = ret[1][0];
        temp1 = ret[1][1];
        temp2 = ret[1][2];
        ret[1][0] = ret[0][2];
        ret[1][1] = ret[0][5];
        ret[1][2] = ret[0][8];
        ret[0][2] = ret[3][8];
        ret[0][5] = ret[3][7];
        ret[0][8] = ret[3][6];
        ret[3][8] = ret[5][6];
        ret[3][7] = ret[5][3];
        ret[3][6] = ret[5][0];
        ret[5][6] = temp0;
        ret[5][3] = temp1;
        ret[5][0] = temp2;


        break;
    }


    // case 6 ……
    // case 7 ……
    // 其他17种赋值方法


    return ret;
}


void main() {
    int (*c0)[9] = new int[6][9];


    // 为二维数组赋值,其中int[0][] = {1} int[2][] ={10} ……
    // 为统计最后的颜色提供方便
    for (int i = 0; i < 6; i++)
    {
        for (int j = 0; j < 9; j++)
        {
            c0[i][j] = (int) pow(10.0, i);
        }
    }


//for (int i = 0; i < 6; i++)
 //   {
 //       for (int j = 0; j < 9; j++)
 //       {
 //           c0[i][j] = 10 * i + j;
 //       }
 //   }


    int max = 0;


    for (int s1 = 1; s1 <= 5; s1++) {
        int (*c1)[9] = turn(c0, s1);
        for (int s2 = 1; s2 <= 5; s2++) {
            int (*c2)[9] = turn(c1, s2);
            for (int s3 = 1; s3 <= 5; s3++) {
                int (*c3)[9] = turn(c2, s3);
                for (int s4 = 1; s4 <= 5; s4++) {
                    int (*c4)[9] = turn(c3, s4);


                    int sum = 0, count = 0, num1 = 0;
                    for (int j = 0; j < 9; j++) {
                        sum += c4[0][j];
                    }
num1 = sum;
                    while (sum != 0)
                    {
                        // 如 结果为333000 代表DEF三个面有颜色,输出count 为3,即三种颜色
                        if (sum % 10 != 0)
                        {
                            count++;
                        }
sum /= 10;
                    }


                    if (count > max)
{
max = count;
}


if ( 2 == s1 && 1 == s2 && 2 == s3 && 3 == s4)
{
printf("%d%d%d%d\n",s1,s2,s3,s4);
printf("                       %6d%6d%6d\n",c1[1][6],c1[1][3],c1[1][0]);
printf("                     顶%6d%6d%6d\n",c1[1][7],c1[1][4],c1[1][1]);
printf("                       %6d%6d%6d\n",c1[1][8],c1[1][5],c1[1][2]);
printf("  %6d%6d%6d   %6d%6d%6d    %6d%6d%6d\n",c1[2][0],c1[2][1],c1[2][2],c1[0][0],c1[0][1],c1[0][2],c1[4][8],c1[4][7],c1[4][6]);
   printf("左%6d%6d%6d 中%6d%6d%6d  右%6d%6d%6d\n",c1[2][3],c1[2][4],c1[2][5],c1[0][3],c1[0][4],c1[0][5],c1[4][5],c1[4][4],c1[4][3]);
printf("  %6d%6d%6d   %6d%6d%6d    %6d%6d%6d\n",c1[2][6],c1[2][7],c1[2][8],c1[0][6],c1[0][7],c1[0][8],c1[4][2],c1[4][1],c1[4][0]);
printf("                       %6d%6d%6d\n",c1[3][2],c1[3][5],c1[3][8]);
printf("                     底%6d%6d%6d\n",c1[3][1],c1[3][4],c1[3][7]);
printf("                       %6d%6d%6d\n",c1[3][0],c1[3][3],c1[3][6]);
printf("                       %6d%6d%6d\n",c1[5][8],c1[5][7],c1[5][6]);
printf("                     背%6d%6d%6d\n",c1[5][5],c1[5][4],c1[5][3]);
printf("                       %6d%6d%6d\n",c1[5][2],c1[5][1],c1[5][0]);


printf("%d%d%d%d\n",s1,s2,s3,s4);
printf("                       %6d%6d%6d\n",c2[1][6],c2[1][3],c2[1][0]);
printf("                     顶%6d%6d%6d\n",c2[1][7],c2[1][4],c2[1][1]);
printf("                       %6d%6d%6d\n",c2[1][8],c2[1][5],c2[1][2]);
printf("  %6d%6d%6d   %6d%6d%6d    %6d%6d%6d\n",c2[2][0],c2[2][1],c2[2][2],c2[0][0],c2[0][1],c2[0][2],c2[4][8],c2[4][7],c2[4][6]);
   printf("左%6d%6d%6d 中%6d%6d%6d  右%6d%6d%6d\n",c2[2][3],c2[2][4],c2[2][5],c2[0][3],c2[0][4],c2[0][5],c2[4][5],c2[4][4],c2[4][3]);
printf("  %6d%6d%6d   %6d%6d%6d    %6d%6d%6d\n",c2[2][6],c2[2][7],c2[2][8],c2[0][6],c2[0][7],c2[0][8],c2[4][2],c2[4][1],c2[4][0]);
printf("                       %6d%6d%6d\n",c2[3][2],c2[3][5],c2[3][8]);
printf("                     底%6d%6d%6d\n",c2[3][1],c2[3][4],c2[3][7]);
printf("                       %6d%6d%6d\n",c2[3][0],c2[3][3],c2[3][6]);
printf("                       %6d%6d%6d\n",c2[5][8],c2[5][7],c2[5][6]);
printf("                     背%6d%6d%6d\n",c2[5][5],c2[5][4],c2[5][3]);
printf("                       %6d%6d%6d\n",c2[5][2],c2[5][1],c2[5][0]);


printf("%d%d%d%d\n",s1,s2,s3,s4);
printf("                       %6d%6d%6d\n",c3[1][6],c3[1][3],c3[1][0]);
printf("                     顶%6d%6d%6d\n",c3[1][7],c3[1][4],c3[1][1]);
printf("                       %6d%6d%6d\n",c3[1][8],c3[1][5],c3[1][2]);
printf("  %6d%6d%6d   %6d%6d%6d    %6d%6d%6d\n",c3[2][0],c3[2][1],c3[2][2],c3[0][0],c3[0][1],c3[0][2],c3[4][8],c3[4][7],c3[4][6]);
   printf("左%6d%6d%6d 中%6d%6d%6d  右%6d%6d%6d\n",c3[2][3],c3[2][4],c3[2][5],c3[0][3],c3[0][4],c3[0][5],c3[4][5],c3[4][4],c3[4][3]);
printf("  %6d%6d%6d   %6d%6d%6d    %6d%6d%6d\n",c3[2][6],c3[2][7],c3[2][8],c3[0][6],c3[0][7],c3[0][8],c3[4][2],c3[4][1],c3[4][0]);
printf("                       %6d%6d%6d\n",c3[3][2],c3[3][5],c3[3][8]);
printf("                     底%6d%6d%6d\n",c3[3][1],c3[3][4],c3[3][7]);
printf("                       %6d%6d%6d\n",c3[3][0],c3[3][3],c3[3][6]);
printf("                       %6d%6d%6d\n",c3[5][8],c3[5][7],c3[5][6]);
printf("                     背%6d%6d%6d\n",c3[5][5],c3[5][4],c3[5][3]);
printf("                       %6d%6d%6d\n",c3[5][2],c3[5][1],c3[5][0]);


printf("%d%d%d%d\n",s1,s2,s3,s4);
printf("                       %6d%6d%6d\n",c4[1][6],c4[1][3],c4[1][0]);
printf("                     顶%6d%6d%6d\n",c4[1][7],c4[1][4],c4[1][1]);
printf("                       %6d%6d%6d\n",c4[1][8],c4[1][5],c4[1][2]);
printf("  %6d%6d%6d   %6d%6d%6d    %6d%6d%6d\n",c4[2][0],c4[2][1],c4[2][2],c4[0][0],c4[0][1],c4[0][2],c4[4][8],c4[4][7],c4[4][6]);
   printf("左%6d%6d%6d 中%6d%6d%6d  右%6d%6d%6d\n",c4[2][3],c4[2][4],c4[2][5],c4[0][3],c4[0][4],c4[0][5],c4[4][5],c4[4][4],c4[4][3]);
printf("  %6d%6d%6d   %6d%6d%6d    %6d%6d%6d\n",c4[2][6],c4[2][7],c4[2][8],c4[0][6],c4[0][7],c4[0][8],c4[4][2],c4[4][1],c4[4][0]);
printf("                       %6d%6d%6d\n",c4[3][2],c4[3][5],c4[3][8]);
printf("                     底%6d%6d%6d\n",c4[3][1],c4[3][4],c4[3][7]);
printf("                       %6d%6d%6d\n",c4[3][0],c4[3][3],c4[3][6]);
printf("                       %6d%6d%6d\n",c4[5][8],c4[5][7],c4[5][6]);
printf("                     背%6d%6d%6d\n",c4[5][5],c4[5][4],c4[5][3]);
printf("                       %6d%6d%6d\n",c4[5][2],c4[5][1],c4[5][0]);
}


                    delete[] c4;
                }
                delete[] c3;
            }
            delete[] c2;
        }
        delete[] c1;
    }


    printf("%6d\n", max);
    system("PAUSE");
}


0 0
原创粉丝点击