偶然在牛客网上看到的校招题目,很有意思!自己写了一个程序,但是有小问题没有调试成功,而后网上搜索二阶魔方,找到了一个成功版本!继续优化中,好了不说了上代码:
#include < vector>
#include < istream> //基本输入流
#include < ostream> //基本输出流
#include <iostream>
#include<algorithm>//包含max函数
using namespace std;
typedef long long LL;
//置换群
const int mp[6][24] = {
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 21, 20, 10, 11, 12, 13, 18, 16, 19, 17, 15, 14, 22, 23 },
{ 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 },
{ 20, 1, 22, 3, 10, 4, 0, 7, 8, 9, 11, 5, 2, 13, 14, 15, 6, 17, 12, 19, 16, 21, 18, 23 },
{ 0, 1, 11, 5, 4, 16, 12, 6, 2, 9, 10, 17, 13, 7, 3, 15, 14, 8, 18, 19, 20, 21, 22, 23 },
{ 10, 4, 2, 3, 18, 5, 6, 7, 8, 0, 19, 11, 12, 13, 14, 1, 16, 17, 15, 9, 21, 23, 20, 22 }
};
//六面的数字
const int face[6][4] = {
{ 0, 1, 2, 3 },
{ 4, 5, 10, 11 },
{ 6, 7, 12, 13 },
{ 8, 9, 14, 15 },
{ 16, 17, 18, 19 },
{ 20, 21, 22, 23 }
};
//输出结果
LL ans;
//转置后的顺序
void flip(vector<int> &a, int index)
{
vector<int> b(a);
for (int i = 0; i < 24; i++)
b[i] = a[mp[index][i]];
a = b;
}
//获取6面积和
LL getSum(vector<int> &arr)
{
LL ret = 0;
for (int i = 0; i < 6; i++) {
LL s = 1;
for (int j = 0; j < 4; j++)
s *= arr[face[i][j]];
ret += s;
}
return ret;
}
//递归求最大和
void dfs(int dep, vector<int> arr)
{
ans = max(ans, getSum(arr));
if (dep == 5) {
return;
}
for (int i = 0; i < 6; i++) {
vector<int> a(arr);
flip(a, i);
dfs(dep + 1, a); //顺时针
flip(a, i);//顺时针旋转3次可以得到逆时针
flip(a, i);
dfs(dep + 1, a);
}}
//显示数组
void dispArr(int* arr, int n)
{
for (int i = 0; i < n; i++)
{
cout << "arr" << "[" << i << "]" << " is:" << arr[i] << endl;
}
}
int main()
{
/*while (true) {
bool isBreak = true;
vector<int> arr(24);
for (int i = 0; i < 24; i++)
if (cin >> arr[i])
isBreak = false;
else
break;
if (isBreak)
break;
ans = -0x3f3f3f3f3f;*/
int arr[24] = { 2, -3, -2, 3, 7, -6, -6, -7, 9, -5, -9, -3, -2, 1, 4,-9, -1, -10, -5, -5, -10, -4, 8, 2 };
vector<int> arr1;
for (int i = 0; i < 24;i++)
{
arr1.push_back(arr[i]);
}
flip(arr1, 5);
cout << 'next' << endl;
system("pause");
return 0;
}
原文出自:http://blog.youkuaiyun.com/flushhip/article/details/78267949#comments