一个魔方,在转动了四次之后,一个面最多可能出现多少种颜色,为什么?
来源:互联网 发布: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");
}
- 一个魔方,在转动了四次之后,一个面最多可能出现多少种颜色,为什么?
- 一个西瓜 4刀最多多少块
- 一个进程最多能包含多少线程
- 1、在一个由自然数1-1000中某些数字所组成的数组中,每个数字可能出现零次或者多次。设计一个算法,找出出现次数最多的数字。
- 【一个经典的google面试题】在浏览器中输入Google.com并且按下回车之后发生了什么?
- 面试题:求一个字符串中连续出现次数最多的子串
- 写一个程序,统计出一个文本文件中一共出现了多少个字母‘a’?
- 为什么一个Java源文件最多只能有一个public类
- J2EE面试题之 java如何找出一个int数组中出现次数最多的数字以及出现次数?
- 测试一个表空间最多可以创建多少个文件
- 一个mssqlserver表最多可以存放多少数据??
- 一个进程(Process)最多可以生成多少个线程(Thread)
- window一个文件夹中最多可以存储多少个文件
- 一个进程(Process)最多可以生成多少个线程(Thread)
- 一个进程(Process)最多可以生成多少个线程(Thread)
- 一个try{}后最多可以有多少个catch()语句
- MySQL的一个表最多可以有多少个字段
- utf8一个汉字最多需要多少个byte
- 《思考OO》
- 开源小游戏-基于android sample snake
- php读取mysql简单示例代码
- 【Android 应用开发】Android - 时间 日期相关组件
- wpf只运行一个实例
- 一个魔方,在转动了四次之后,一个面最多可能出现多少种颜色,为什么?
- 如何用openssl命令行生成证书
- 获取每个月第一个星期日的日期
- mvc:view-controller
- Java的Web框架 Firefly Framework
- 用数据线连接手机,使用java程序控制手机发短信,打电话
- 开源项目几点心得,Java架构必会几大技术点
- jquery sortable的拖动方法讲解
- 【LeetCode】N-Queens && 【九度】题目1140:八皇后