我在这里发布了一个关于魔方的问题(你不需要阅读):A simple console Rubik's cube in C (No need to solve, only design)
基本上,我只需要帮助,所以我可以在我的魔方计划中实现这一点。假设,左边有4个数字,例如[1,2,3,4]
和推送,现在变为[4,1,2,3]
。如果我再次推送它,它应该变为[3,4,1,2]
。
基本上,我想要实现的是在立方体上旋转一行。我的旋转功能是这样的(我还在改变它,因为这不能很好地工作):
void swapRow(int row)
{
int placeHolder[3]; //Consider it as a 'blank' row
for(int j=0; j<3; j++)
placeHolder[j] = cube[front][row][j];
for(int j=0; j<3; j++)
cube[front][row][j] = cube[front+1][row][j];
for(int j=0; j<3; j++)
cube[front-1][row][j] = placeHolder[j];
}
这是我的立方体阵列:
int cube[6][3][3] = {{{1,1,1},{1,1,1},{1,1,1}},
{{2,2,2},{2,2,2},{2,2,2}},
{{3,3,3},{3,3,3},{3,3,3}},
{{4,4,4},{4,4,4},{4,4,4}},
{{5,5,5},{5,5,5},{5,5,5}},
{{6,6,6},{6,6,6},{6,6,6}}};
front
是一个变量并且是1.这就是问题所在,如果我一次又一次地交换,它会转到4,然后是5,然后是6等等我希望它转到4 ,然后是1,然后是2,然后是3,然后是4,然后再是1,因为它有多少边(不考虑顶部和底部)。
您认为我怎么能做到这一点?我使用的是C,而不是C ++。我将添加所需的任何其他信息。 :)
答案 0 :(得分:1)
建议使用像:
这样的旋转器对象typedef struct
{
int *values;
int mod;
int size; //if you want to generalize the rubiks..
}rotator;
void rotate(rotator *rotator)
{
rotator->mod = (rotator->mod + 1) % rotator->size;
}
void print_rotator(rotator *rotator)
{
int index;
fprintf(stdout, "[");
for(index = 0; index < rotator->size; ++index)
{
fprintf(stdout, "%d,", rotator->values[(index + rotator->mod) % rotator->size]);
}
fprintf(stdout, "]\n");
}
然后你可以考虑如何将它构建成一个n-ary立方体..