正方體頂點排列問題
問題描述
輸入一個含有8個數字的數組,判斷有沒有可能把這8個數字分別放到正方體的8個頂點上,使得正方體上三組相對的面上的4個頂點的和相等。
問題分析:
* * 這就相當於先得到a1,a2,a3,a4,a5,a6,a7,a8這8個數字的所有排列,然後判斷有沒有一個的排列符合題目給定的條件,即a1+a2+a3+a4=a5+a6+a7+a8,
* * a1+a3+a5+a7=a2+a4+a6+a8,並且a1+a2+a5+a6=a3+a4+a7+a8.
public class Code028_02 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] data = new int[8];
for (int i = 0; i < 8; i++) {
data[i] = sc.nextInt();
}
// permutation(data, 0);
// System.out.println(count);
boolean result=cubeVertex(data);
System.out.println(result);
}
static int count = 0;
private static void permutation(int[] data, int index) {
if (index == data.length - 1) {
if (data[0] + data[1] + data[2] + data[3] == data[4] + data[5] + data[6] + data[7] &&
data[0] + data[2] + data[4] + data[6] == data[1] + data[3] + data[5] + data[7] &&
data[0] + data[1] + data[4] + data[5] == data[2] + data[3] + data[6] + data[7]) {
for (int i = 0; i < data.length; i++) {
System.out.print("" + data[i] + " ,");
}
count += 1;
System.out.println();
}
}
for (int i = index; i < data.length; i++) {
swap(data, index, i);
permutation(data, index + 1);
swap(data, index, i);
}
}
private static void swap(int[] data, int index, int i) {
int temp = data[index];
data[index] = data[i];
data[i] = temp;
}
//方式二:
private static boolean cubeVertex(int[] data) {
if (data.length != 8) {
return false;
}
return cubeCore(data, 0);
}
private static boolean cubeCore(int[] data, int start) {
if (data.length != 8 || start < 0) {
return false;
}
boolean result = false;
if (start == data.length - 1) {
if (Sum(data, 0, 1, 2, 3) == Sum(data, 4, 5, 6, 7) && Sum(data, 0, 2, 4, 6) == Sum(data, 1, 3, 5, 7) &&
Sum(data, 0, 1, 4, 5) == Sum(data, 2, 3, 6, 7)) {
result = true;
}
} else {
for (int i = start; i < data.length; i++) {
if (i != start && data[i] == data[start]) {
continue;
}
swap(data, i, start);
result = cubeCore(data, start + 1);
if (result) {
break;
}
swap(data, i, start);
}
}
return result;
}
private static int Sum(int[] data, int i, int i1, int i2, int i3) {
return data[i] + data[i1] + data[i2] + data[i3];
}
//字符全排列測試函數
@Test
public void test(){
String yy ="ABCD";
char data[] = yy.toCharArray();
sq(data, 0);
}
public static void sq(char data[], int k) {
if (k == data.length) {
for (int i = 0; i < data.length; i++) {
System.out.print(data[i] + " ");
}
System.out.println();
}
for (int i = k; i < data.length; i++) {
{
char temp = data[k];
data[k] = data[i];
data[i] = temp;
}
sq(data, k + 1);
{
char temp = data[k];
data[k] = data[i];
data[i] = temp;
}
}
}
}