user-0 提问: 输入一个含有8个数字的数组,判断有没有可能把这8个数字分别放到正方体的8个顶点上，使得正方体上三组相对的面上的4个顶点的和相等。

回复:
user: user-1
content: 晕，是临时变量c，我CSDN不能编辑帖子，我擦

user: user-1
content: 不好意思，上面的check()中的c忘了重置为0 #include <stdafx.h> #include <stdio.h> 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 < 4;i ++) //计算出第一个面的总和作为参考 		c += array[offset[0][i]]; 	for(i = 1;i < 6;i ++) //从第二面开始 	{ 		for(int j = 0;j < 4;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; }

user: user-1
content: #include <stdafx.h> #include <stdio.h> 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 < 4;i ++) //计算出第一个面的总和作为参考 		c += array[offset[0][i]]; 	for(i = 1;i < 6;i ++) //从第二面开始 	{ 		for(int j = 0;j < 4;j ++) //计算面上顶点上的数的总和 			t += array[offset[i][j]]; 		if(t != c) //有任何的面不等于c都视为失败 			return 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; }  不知道对不对，不过描述的算法应该没问题。楼下轻喷。

user: user-2
content: 帮ylbhz断帖。

user: user-2
content: next_permutation

user: user-3
content: 上面还少说了一步，要加上初始化每个面上的顶点序号。 1种编号方式如下： 前后两个面的顶点分别是 1 2 3 4 ，5 6 7 8         5          6 1         2      7          8                   3         4

user: user-3
content: 1）给顶点，面编号， 2）求相对面，写成函数 3）枚举三个面，可以得到一种，安排方式的结果。 4）对顶点全排列，再按照上面的方式处理，即可得到所有安排的结果。 5）遍历该排列，即可得到结果。

user: user-4
content: 引用 2 楼 a1232345 的回复:[quote=引用 1 楼 u011636587 的回复:] 沙发，同求，随时关注本帖，学习一切可学习的知识 还以为是回答了。。。[/quote] 别激动，我们两个聊着聊着就有人回答了

user: user-0
content: 引用 1 楼 u011636587 的回复:沙发，同求，随时关注本帖，学习一切可学习的知识 还以为是回答了。。。

user: user-4
content: 沙发，同求，随时关注本帖，学习一切可学习的知识