现在Nero有一个数字魔方,他想知道这个魔方在操作不超过5次的前提下能达到的最大优美度是多少。
输入一行包含24个数字,按序号顺序给出魔方每一块上面的数字。所有数大小范围为[-100,100]。
输出一行包含一个数字,表示最大优美度。
2 -3 -2 3 7 -6 -6 -7 9 -5 -9 -3 -2 1 4 -9 -1 -10 -5 -5 -10 -4 8 2
8281
【题解】最多五步,每一步都有6种可能,分别是前面,上面和右面顺时针或逆时针旋转90度。枚举就可以啦!
#include <iostream>
#include <algorithm>
using namespace std;
class Cube
{
friend istream& operator>>(istream &in, Cube &obj);
private:
int _up[4];
int _down[4];
int _left[4];
int _right[4];
int _front[4];
int _back[4];
int calnow() const;
void upp(); // 上层顺时针旋转90度
void upn(); // 上层逆时针旋转90度
void rightp(); // 右层顺时针旋转90度
void rightn(); // 右层逆时针旋转90度
void frontp(); // 前层顺时针旋转90度
void frontn(); // 前层逆时针旋转90度
public:
int rotate(int) const;
};
istream& operator>>(istream &in, Cube &obj)
{
in >> obj._up[0] >> obj._up[1] >> obj._up[2] >> obj._up[3];
in >> obj._left[0] >> obj._left[1] >> obj._front[0] >> obj._front[1];
in >> obj._right[0] >> obj._right[1] >> obj._left[2] >> obj._left[3];
in >> obj._front[2] >> obj._front[3] >> obj._right[2] >> obj._right[3];
in >> obj._down[0] >> obj._down[1] >> obj._down[2] >> obj._down[3];
in >> obj._back[0] >> obj._back[1] >> obj._back[2] >> obj._back[3];
return in;
}
int Cube::calnow() const
{
int now[6] = { 1, 1, 1, 1, 1, 1 }, result = 0;
for (int i = 0; i < 4; i++) {
now[0] *= _up[i]; now[1] *= _down[i];
now[2] *= _left[i]; now[3] *= _right[i];
now[4] *= _front[i]; now[5] *= _back[i];
}
for (int i = 0; i < 6; i++) {
result += now[i];
}
return result;
}
void Cube::upp()
{
swap(_up[0], _up[1]);
swap(_up[0], _up[3]);
swap(_up[0], _up[2]);
swap(_front[0], _left[0]); swap(_front[1], _left[1]);
swap(_front[0], _back[3]); swap(_front[1], _back[2]);
swap(_front[0], _right[0]); swap(_front[1], _right[1]);
}
void Cube::upn()
{
swap(_up[0], _up[2]);
swap(_up[0], _up[3]);
swap(_up[0], _up[1]);
swap(_front[0], _right[0]); swap(_front[1], _right[1]);
swap(_front[0], _back[3]); swap(_front[1], _back[2]);
swap(_front[0], _left[0]); swap(_front[1], _left[1]);
}
void Cube::rightp()
{
swap(_right[0], _right[1]);
swap(_right[0], _right[3]);
swap(_right[0], _right[2]);
swap(_front[1], _up[1]); swap(_front[3], _up[3]);
swap(_front[1], _back[1]); swap(_front[3], _back[3]);
swap(_front[1], _down[1]); swap(_front[3], _down[3]);
}
void Cube::rightn()
{
swap(_right[0], _right[2]);
swap(_right[0], _right[3]);
swap(_right[0], _right[1]);
swap(_front[1], _down[1]); swap(_front[3], _down[3]);
swap(_front[1], _back[1]); swap(_front[3], _back[3]);
swap(_front[1], _up[1]); swap(_front[3], _up[3]);
}
void Cube::frontp()
{
swap(_front[0], _front[1]);
swap(_front[0], _front[3]);
swap(_front[0], _front[2]);
swap(_up[2], _right[0]); swap(_up[3], _right[2]);
swap(_up[2], _down[1]); swap(_up[3], _down[0]);
swap(_up[2], _left[3]); swap(_up[3], _left[1]);
}
void Cube::frontn()
{
swap(_front[0], _front[2]);
swap(_front[0], _front[3]);
swap(_front[0], _front[1]);
swap(_up[2], _left[3]); swap(_up[3], _left[1]);
swap(_up[2], _down[1]); swap(_up[3], _down[0]);
swap(_up[2], _right[0]); swap(_up[3], _right[2]);
}
int Cube::rotate(int n) const
{
Cube temp = *this;
while (n != 0) {
switch (n % 6)
{
case 1:temp.upp(); break;
case 2:temp.upn(); break;
case 3:temp.rightp(); break;
case 4:temp.rightn(); break;
case 5:temp.frontp(); break;
default:temp.frontn(); break;
}
n /= 6;
}
return temp.calnow();
}
int main()
{
Cube cube; cin >> cube;
int result = 0;
for (int i = 1; i < 7776; i++) {
result = max(result, cube.rotate(i));
}
cout << result;
return 0;
}
#include <iostream> #include <algorithm> #include <vector> #include <limits.h> using namespace std; int ans; // 6个面的关联下标,每次选一个面,面上数字转动1位,面边位置移动2位 int pa[6][4] = { {0,1,3,2}, {4,5,11,10}, {6,7,13,12}, {8,9,15,14}, {16,17,19,18}, {20,21,23,22} }; int side[6][8] = { {9,8,7,6,5,4,22,23}, {0,2,6,12,16,18,20,22}, {2,3,8,14,17,16,11,5}, {3,1,23,21,19,17,13,7}, {12,13,14,15,21,20,10,11},{18,19,15,9,1,0,4,10} }; void dfs(vector<int> &data,int step) { int sum = 0; // update ans for (int j = 0; j < 6; j++) sum += data[pa[j][0]] * data[pa[j][1]] * data[pa[j][2]] * data[pa[j][3]]; ans = max(ans, sum); if (step >= 5) return; vector<int> temp(24); int dir = -1; // 正时针or逆时针 while (1) { for (int i = 0; i < 6; i++) { // 选一个面 for (int j = 0; j < 24; j++) temp[j] = data[j]; for (int j = 0; j < 4; j++) // 面上的数字转动 temp[pa[i][j]] = data[pa[i][(j + dir + 4) % 4]]; for (int j = 0; j < 8; j++) // 面边上的数字转动 temp[side[i][j]] = data[side[i][(j + dir * 2 + 8) % 8]]; dfs(temp, step + 1); } if (dir > 0) break; else dir *= -1; } } int main() { vector<int> data(24); for (int i = 0; i < 24; i++) cin >> data[i]; ans = INT_MIN; dfs(data, 0); cout << ans; return 0; }
def compute(A): return A[0]*A[1]*A[2]*A[3] + A[4]*A[5]*A[10]*A[11] + A[6]*A[7]*A[12]*A[13] + A[8]*A[9]*A[14]*A[15] + A[16]*A[17]*A[18]*A[19] + A[20]*A[21]*A[22]*A[23] def DS(A,i): if i == 0: return #六种情况进行旋转,每次转动12个。 A1 = A.copy() A1[1], A1[3],A1[7], A1[13], A1[17], A1[19],A1[21],A1[23],A1[8], A1[9],A1[14],A1[15] = A1[7], A1[13], A1[17], A1[19],A1[21],A1[23], A1[1], A1[3],A1[14], A1[8],A1[15],A1[9] res.append(compute(A1)) DS(A1,i-1) A2 = A.copy() A2[1], A2[3],A2[7], A2[13], A2[17], A2[19],A2[21],A2[23],A2[8], A2[9],A2[14],A2[15] = A2[21],A2[23], A2[1], A2[3], A2[7], A2[13], A2[17],A2[19],A2[9], A2[15],A2[8],A2[14] res.append(compute(A2)) DS(A2,i-1) A3 = A.copy() A3[4], A3[5], A3[6], A3[7], A3[8], A3[9], A3[23], A3[22],A3[0], A3[1], A3[2], A3[3] = A3[6], A3[7], A3[8], A3[9], A3[23], A3[22], A3[4], A3[5],A3[2], A3[0], A3[3], A3[1] res.append(compute(A3)) DS(A3,i-1) A4 = A.copy() A4[4], A4[5], A4[6], A4[7], A4[8], A4[9], A4[23], A4[22],A4[0], A4[1], A4[2], A4[3] = A4[23], A4[22], A4[4], A4[5], A4[6], A4[7], A4[8], A4[9],A4[1], A4[3], A4[0], A4[2] res.append(compute(A4)) DS(A4,i-1) A5 = A.copy() A5[2], A5[3], A5[8], A5[14], A5[17], A5[16], A5[11], A5[5],A5[6], A5[7], A5[12], A5[13] = A5[8], A5[14], A5[17], A5[16], A5[11], A5[5], A5[2], A5[3], A5[7], A5[13], A5[6], A5[12] res.append(compute(A5)) DS(A5,i-1) A6 = A.copy() A6[2], A6[3], A6[8], A6[14], A6[17], A6[16], A6[11], A6[5], A6[6], A6[7], A6[12], A6[13] = A6[11], A6[5], A6[2], A6[3], A6[8], A6[14], A6[17], A6[16], A6[12], A6[6], A6[13], A6[7] res.append(compute(A6)) DS(A6,i-1) i += -1 row= [int(i) for i in input().strip().split()] res = [compute(row)] i = 5 DS(row,i) print(max(res))
//
// 我也是调了一万年,发现只有三个面能转。
// 与上面几位思路不同,我是将几个面旋转之后的位置变化手动找出来,这样个人认为能省不少事,写代码转换也是要自己推一遍旋转,不如直接写来的有效率,代码如下。
// InterView
//
// Created by Racle on 2018/8/23.
// Copyright © 2018年 Racle. All rights reserved.
//
#include <stdio.h>
#include <vector>
#include <set>
#include <iostream>
using namespace std;
set<vector<int>> s;
int next_[][24] = {
{2,0,3,1,6,7,8,9,23,22,10,11,12,13,14,15,16,17,18,19,20,21,5,4}, //顶顺
{1,3,0,2,23,22,4,5,6,7,10,11,12,13,14,15,16,17,18,19,20,21,9,8}, //顶逆
{0,21,2,23,4,5,6,1,9,15,10,11,12,3,8,14,16,7,18,13,20,17,22,19}, //右下
{0,7,2,13,4,5,6,17,14,8,10,11,12,19,15,9,16,21,18,23,20,1,22,3}, //右上
{0,1,11,5,4,16,12,6,2,9,10,17,13,7,3,15,14,8,18,19,20,21,22,23},//前顺
{0,1,8,14,4,3,7,13,17,9,10,2,6,12,16,15,5,11,18,19,20,21,22,23},//前逆
};
int btf(vector<int> &v){ //计算当前状态的优美度
int arr[] = {0,1,2,3,4,5,10,11,6,7,12,13,8,9,14,15,16,17,18,19,20,21,22,23};
int res = 0,k=1;
for (int i=0; i<24; i++) {
k *= v[arr[i]];
if((i+1)%4==0){
res += k;
k=1;
}
}
return res;
}
void turn(vector<int> v,int step,int &i_max){ //递归计算,由于限制了5次,时间和空间绝对够用
if(step>5) return ;
i_max = max(i_max, btf(v)); //判断是否最大
vector<int> record;
for (int i=0; i<6; i++) {
for (int j=0; j<24; j++) {
record.push_back(v[next_[i][j]]);
}
turn(record, step+1, i_max);
record.clear();
}
}
int main(){
int res = -2147483648,k;
vector<int> v(24);
for(int i=0; i<24; i++){
cin>>k;
v[i] = k;
}
turn(v, 0, res);
cout<<res<<endl;
return 0;
}
#include<iostream> using namespace std; int sum(int *a){ int sum=0; sum+=a[0]*a[1]*a[2]*a[3]; sum+=a[4]*a[5]*a[10]*a[11]; sum+=a[6]*a[7]*a[12]*a[13]; sum+=a[8]*a[9]*a[14]*a[15]; sum+=a[16]*a[17]*a[18]*a[19]; sum+=a[20]*a[21]*a[22]*a[23]; return sum; } static int Max=0; void move1(int *a){ int buf[8]={0,2,6,12,16,18,20,22}; int tmp=a[buf[0]],tmpp=a[buf[1]]; for (int i=0; i<6; i+=2) { a[buf[i]]=a[buf[i+2]]; a[buf[i+1]]=a[buf[i+3]]; } a[buf[7]]=tmpp; a[buf[6]]=tmp; int buff[4]={5,11,10,4}; tmp=a[buff[0]]; for (int i=0; i<3; i++) { a[buff[i]]=a[buff[i+1]]; } a[buff[3]]=tmp; return; } void demove1(int *a){ int buf[8]={0,2,6,12,16,18,20,22}; int tmp=a[buf[6]],tmpp=a[buf[7]];; for (int i=7; i>1; i-=2) { a[buf[i]]=a[buf[i-2]]; a[buf[i-1]]=a[buf[i-3]]; } a[buf[0]]=tmp; a[buf[1]]=tmpp; int buff[4]={5,11,10,4}; tmp=a[buff[3]]; for (int i=3; i>0; i--) { a[buff[i]]=a[buff[i-1]]; } a[buff[0]]=tmp; return; } void move2(int *a){ int buf[8]={1,3,7,13,17,19,21,23}; int tmp=a[buf[0]],tmpp=a[buf[1]]; for (int i=0; i<6; i+=2) { a[buf[i]]=a[buf[i+2]]; a[buf[i+1]]=a[buf[i+3]]; } a[buf[7]]=tmpp; a[buf[6]]=tmp; int buff[4]={8,14,15,9}; tmp=a[buff[0]]; for (int i=0; i<3; i++) { a[buff[i]]=a[buff[i+1]]; } a[buff[3]]=tmp; return; } void demove2(int *a){ int buf[8]={1,3,7,13,17,19,21,23}; int tmp=a[buf[6]],tmpp=a[buf[7]];; for (int i=7; i>1; i-=2) { a[buf[i]]=a[buf[i-2]]; a[buf[i-1]]=a[buf[i-3]]; } a[buf[0]]=tmp; a[buf[1]]=tmpp; int buff[4]={8,14,15,9}; tmp=a[buff[3]]; for (int i=3; i>0; i--) { a[buff[i]]=a[buff[i-1]]; } a[buff[0]]=tmp; return; } void move3(int *a){ int buf[8]={4,5,6,7,8,9,23,22}; int tmp=a[buf[0]],tmpp=a[buf[1]]; for (int i=0; i<6; i+=2) { a[buf[i]]=a[buf[i+2]]; a[buf[i+1]]=a[buf[i+3]]; } a[buf[7]]=tmpp; a[buf[6]]=tmp; int buff[4]={0,2,3,1}; tmp=a[buff[0]]; for (int i=0; i<3; i++) { a[buff[i]]=a[buff[i+1]]; } a[buff[3]]=tmp; return; } void demove3(int *a){ int buf[8]={4,5,6,7,8,9,23,22}; int tmp=a[buf[6]],tmpp=a[buf[7]];; for (int i=7; i>1; i-=2) { a[buf[i]]=a[buf[i-2]]; a[buf[i-1]]=a[buf[i-3]]; } a[buf[0]]=tmp; a[buf[1]]=tmpp; int buff[4]={0,2,3,1}; tmp=a[buff[3]]; for (int i=3; i>0; i--) { a[buff[i]]=a[buff[i-1]]; } a[buff[0]]=tmp; return; } void move4(int *a){ int buf[8]={10,11,12,13,14,15,21,20}; int tmp=a[buf[0]],tmpp=a[buf[1]]; for (int i=0; i<6; i+=2) { a[buf[i]]=a[buf[i+2]]; a[buf[i+1]]=a[buf[i+3]]; } a[buf[7]]=tmpp; a[buf[6]]=tmp; int buff[4]={17,19,18,16}; tmp=a[buff[0]]; for (int i=0; i<3; i++) { a[buff[i]]=a[buff[i+1]]; } a[buff[3]]=tmp; return; } void demove4(int *a){ int buf[8]={10,11,12,13,14,15,21,20}; int tmp=a[buf[6]],tmpp=a[buf[7]];; for (int i=7; i>1; i-=2) { a[buf[i]]=a[buf[i-2]]; a[buf[i-1]]=a[buf[i-3]]; } a[buf[0]]=tmp; a[buf[1]]=tmpp; int buff[4]={17,19,18,16}; tmp=a[buff[3]]; for (int i=3; i>0; i--) { a[buff[i]]=a[buff[i-1]]; } a[buff[0]]=tmp; return; } void move5(int *a){ int buf[8]={2,3,8,14,17,16,11,5}; int tmp=a[buf[0]],tmpp=a[buf[1]]; for (int i=0; i<6; i+=2) { a[buf[i]]=a[buf[i+2]]; a[buf[i+1]]=a[buf[i+3]]; } a[buf[7]]=tmpp; a[buf[6]]=tmp; int buff[4]={7,13,12,6}; tmp=a[buff[0]]; for (int i=0; i<3; i++) { a[buff[i]]=a[buff[i+1]]; } a[buff[3]]=tmp; return; } void demove5(int *a){ int buf[8]={2,3,8,14,17,16,11,5}; int tmp=a[buf[6]],tmpp=a[buf[7]];; for (int i=7; i>1; i-=2) { a[buf[i]]=a[buf[i-2]]; a[buf[i-1]]=a[buf[i-3]]; } a[buf[0]]=tmp; a[buf[1]]=tmpp; int buff[4]={7,13,12,6}; tmp=a[buff[3]]; for (int i=3; i>0; i--) { a[buff[i]]=a[buff[i-1]]; } a[buff[0]]=tmp; return; } void move6(int *a){ int buf[8]={0,1,9,15,19,18,10,4}; int tmp=a[buf[0]],tmpp=a[buf[1]]; for (int i=0; i<6; i+=2) { a[buf[i]]=a[buf[i+2]]; a[buf[i+1]]=a[buf[i+3]]; } a[buf[7]]=tmpp; a[buf[6]]=tmp; int buff[4]={21,23,22,22}; tmp=a[buff[0]]; for (int i=0; i<3; i++) { a[buff[i]]=a[buff[i+1]]; } a[buff[3]]=tmp; return; } void demove6(int *a){ int buf[8]={0,1,9,15,19,18,10,4}; int tmp=a[buf[6]],tmpp=a[buf[7]];; for (int i=7; i>1; i-=2) { a[buf[i]]=a[buf[i-2]]; a[buf[i-1]]=a[buf[i-3]]; } a[buf[0]]=tmp; a[buf[1]]=tmpp; int buff[4]={21,23,22,20}; tmp=a[buff[3]]; for (int i=3; i>0; i--) { a[buff[i]]=a[buff[i-1]]; } a[buff[0]]=tmp; return; } void move(int *a,int t){ int tmp = sum(a); if(tmp>Max)Max=tmp; if(t==0){ return; }else{ // move1(a); // move(a,t-1); // demove1(a); move2(a); move(a,t-1); demove2(a); move3(a); move(a,t-1); demove3(a); // move4(a); // move(a,t-1); // demove4(a); move5(a); move(a,t-1); demove5(a); // move6(a); // move(a,t-1); // demove6(a); // demove1(a); // move(a,t-1); // move1(a); demove2(a); move(a,t-1); move2(a); demove3(a); move(a,t-1); move3(a); // demove4(a); // move(a,t-1); // move4(a); demove5(a); move(a,t-1); move5(a); // demove6(a); // move(a,t-1); // move6(a); } } int main(){ int a[24]={0}; int i=0; while (i<24) { cin>>a[i]; i++; } move(a,5); cout<<Max; return 0; }
#include<iostream> #include<cmath> using namespace std; class cubic { int a[24] = { 0 }; public: cubic(int ab[24]) { for (int i = 0; i<24; i++) a[i] = ab[i]; return; } int BeautyNum() { int sum = 0; sum += a[0] * a[1] * a[2] * a[3]; sum += a[4] * a[5] * a[10] * a[11]; sum += a[6] * a[7] * a[12] * a[13]; sum += a[8] * a[9] * a[14] * a[15]; sum += a[16] * a[17] * a[18] * a[19]; sum += a[20] * a[21] * a[22] * a[23]; return sum; } void TurnLeft() { int m, n; m = a[2]; n = a[3]; a[2] = a[11]; a[3] = a[5]; a[11] = a[17]; a[5] = a[16]; a[17] = a[8]; a[16] = a[14]; a[8] = m; a[14] = n; m = a[6]; a[6] = a[12]; a[12] = a[13]; a[13] = a[7]; a[7] = m; return; } void TurnRight() { int m, n; m = a[2]; n = a[3]; a[2] = a[8]; a[3] = a[14]; a[8] = a[17]; a[14] = a[16]; a[17] = a[11]; a[16] = a[5]; a[11] = m; a[5] = n; m = a[6]; a[6] = a[7]; a[7] = a[13]; a[13] = a[12]; a[12] = m; return; } void TurnUp() { int m, n; m = a[1]; n = a[3]; a[1] = a[7]; a[3] = a[13]; a[7] = a[17]; a[13] = a[19]; a[17] = a[21]; a[19] = a[23]; a[21] = m; a[23] = n; m = a[14]; a[14] = a[15]; a[15] = a[9]; a[9] = a[8]; a[8] = m; return; } void TurnDown() { int m, n; m = a[1]; n = a[3]; a[1] = a[21]; a[3] = a[23]; a[21] = a[17]; a[23] = a[19]; a[17] = a[7]; a[19] = a[13]; a[7] = m; a[13] = n; m = a[14]; a[14] = a[8]; a[8] = a[9]; a[9] = a[15]; a[15] = m; return; } void TurnClock() { int m, n; m = a[12]; n = a[13]; a[12] = a[10]; a[13] = a[11]; a[10] = a[21]; a[11] = a[20]; a[21] = a[14]; a[20] = a[15]; a[14] = m; a[15] = n; m = a[16]; a[16] = a[18]; a[18] = a[19]; a[19] = a[17]; a[17] = m; return; } void TurnAnti() { int m, n; m = a[12]; n = a[13]; a[12] = a[14]; a[13] = a[15]; a[14] = a[21]; a[15] = a[20]; a[21] = a[10]; a[20] = a[11]; a[10] = m; a[11] = n; m = a[16]; a[16] = a[17]; a[17] = a[19]; a[19] = a[18]; a[18] = m; return; } }; int max(int a[],int m) { int size = m; int max = a[0]; for (int i = 1; i<size; i++) { if (max<a[i]) max = a[i]; } return max; } int TurnBeauty(cubic mc, int k) { if (k == 0) { return mc.BeautyNum(); } else { cubic m1 = mc, m2 = mc, m3 = mc, m4 = mc, m5 = mc, m6 = mc; int n[7],m=7; m1.TurnLeft(); n[0] = TurnBeauty(m1, k - 1); m2.TurnRight(); n[1] = TurnBeauty(m2, k - 1); m3.TurnUp(); n[2] = TurnBeauty(m3, k - 1); m4.TurnDown(); n[3] = TurnBeauty(m4, k - 1); m5.TurnClock(); n[4] = TurnBeauty(m5, k - 1); m6.TurnAnti(); n[5] = TurnBeauty(m6, k - 1); n[6] = mc.BeautyNum(); return max(n,m); } } int main() { int a[24] ; for (int i = 0; i<24; i++) cin >> a[i]; cubic mc(a); cout << TurnBeauty(mc, 5); return 0; }