输入一个含有8个数字的数组,判断有没有可能把这8个数字分别放到正方体的8个顶点上,使得正方体上三组相对的面上的4个顶点的和相等。
输入一个含有8个数字的数组,判断有没有可能把这8个数字分别放到正方体的8个顶点上,使得正方体上三组相对的面上的4个顶点的和相等。
要求用C语言实现,不使用STL中的函数,请问怎么实现了?
数据结构、算法、C/C++
分享到:
------解决方案--------------------
不好意思,上面的check()中的c忘了重置为0
#include
#include
void swap(int &a, int &b)//交换连个元素
{
int tem = a;
a = b;
b = tem;
}
int check(int array[])
{
/*
对正方体八个顶点编号(0-7),对应于数组的8个元素
构成数学模型,我这里为组成的面为
0 1 2 3
4 5 6 7
0 1 4 5
2 3 6 7
1 2 4 7
0 3 5 6
*/
int offset[6][4] =
{
{0, 1, 2, 3},
{4, 5, 6, 7},
{0, 1, 4, 5},
{2, 3, 6, 7},
{1, 2, 4, 7},
{0, 3, 5, 6}
};
int c = 0, t = 0;
for(int i = 0;i
c += array[offset[0][i]];
for(i = 1;i
{
for(int j = 0;j
t += array[offset[i][j]];
if(t != c) //有任何的面不等于c都视为失败
return 0;
c = 0;
}
return 1;
}
void fullarray(int array[], int first, int length) //全排列选择出所有顶点组合
{
if(first == length)
{
int point[8] = {0}; //8个顶点
for(int i = 0; i <= length; i++)
{
printf("%d ", array[i]);
point[i] = array[i];
}
if(check(point))
printf("此组合可以成功。\r\n");
else
printf("\r\n");
}
else
{
for(int i = first; i <= length; i++)
{
swap(array[first], array[i]);
fullarray(array, first+1, length);
swap(array[first], array[i]);
}
}
}
int main(int argc, char* argv[])
{
int a[] = {2, 3, 7, 9, 11, 0, 2, 6}; //8个顶点上的数字
fullarray(a, 0, 7);
return 0;
}