一道“正方体六个面上的四个角点整数之和相等”的求解问题

题目:
请将8个给定的正整数(如1,2,3,4,5,6,7,8)分别放在一个正方体的8个角的顶点上,以实现如下要求(如果可能):正方体六个面上的四个角点整数之和相等?输出结果如:A1=1,A2=2...

求解如下

正方体
算法思路
根据题境,我们先做如下设定和术语说明,以便于后面的讨论:
1、正整数以1,2,3,4,。。。8表示,以便进行分析;
2、正方体顶点标示如上所示;
3、每一个面的四个顶点数总和,我们称为该面的面积;
4、每一条边的两个顶点数和,我们称为该边的长度;

通过分析,可以得到如下断言为真(采用上面设定及术语):
1、每个面的面积相等,且每个面的面积为36/2,即18;
2、正方体的对边相等,如A1A2=A7A8、A2A6=A3A7等等;
3、整数1和(2,3)不在同一边,整数7和8不在同一边;

根据所得断言,可以得到如下求导公式和约束:
A1=1;
A4=18-A1-A2-A3=17-A2-A3;
A6=18-A1-A2-A5=17-A2-A5;
A7=18-A1-A3-A5=17-A3-A5;
A8=A1+A2-A7=2*A1+A2+A3+A5-18=A2+A3+A5-16;

A2,A3,A5为可变量,但是A2,A3,A5不等于2,3

程序实现
通过以上算法分析,可用程序实现如下(Java实现):

java 代码
  1. package qinysong.arithmetic;   
  2.   
  3. public class CubeProblem {   
  4.   
  5.   public static void main(String[] args) {   
  6.     System.out.println("CubeProblem begin ........");   
  7.     searchPeekNumber();   
  8.     System.out.println("CubeProblem end   ........");   
  9.   }   
  10.   
  11.   public static void printPeekNumbers(int[] peeks){   
  12.     System.out.println("the peek number:A1=" + peeks[0] + ";A2=" + peeks[1]   
  13.                        + ";A3=" + peeks[2] + ";A4=" + peeks[3]   
  14.                        + ";A5=" + peeks[4] + ";A6=" + peeks[5]   
  15.                        + ";A7=" + peeks[6] + ";A8=" + peeks[7]);   
  16.   }   
  17.   
  18.   // 核心函数,探寻各个顶点的数值   
  19.   public static void searchPeekNumber(){   
  20.     int[] peeks = new int[8];   
  21.     int peekNumber = 0;   
  22.     for (int i=4; i<=8; i++){   
  23.       peeks[0] = 1;   
  24.       peeks[1] = i;   
  25.       for (int j=4; j<=8; j++){   
  26.         if (hasUsed(2,j, peeks)) continue;   
  27.         peeks[2] = j;   
  28.         peekNumber = getPeekNumber(3, peeks);   
  29.         peeks[3] = peekNumber;   
  30.         for (int k=4; k<=8; k++){   
  31.           if (hasUsed(4,k, peeks)) continue;   
  32.           peeks[4] = k;   
  33.           peekNumber = getPeekNumber(5, peeks);   
  34.           if (hasUsed(5,peekNumber, peeks)) continue;   
  35.           peeks[5] = peekNumber;   
  36.           peekNumber = getPeekNumber(6, peeks);   
  37.           if (hasUsed(6,peekNumber, peeks)) continue;   
  38.           peeks[6] = peekNumber;   
  39.           peekNumber = getPeekNumber(7, peeks);   
  40.           if (hasUsed(7,peekNumber, peeks)) continue;   
  41.           peeks[7] = peekNumber;   
  42.           printPeekNumbers(peeks);   
  43.         }   
  44.       }   
  45.     }   
  46.   }   
  47.   
  48.   /**  
  49.    * 判断获取的顶点值是否在之前的顶点使用过  
  50.    * @param index int 将要赋值的顶点索引  
  51.    * @param peekNumber int  获取的顶点值  
  52.    * @return boolean  是否在之前的顶点使用过  
  53.    */  
  54.   public static boolean hasUsed(int index, int peekNumber,int[] peeks){   
  55.     if (peekNumber <= 0return true;   
  56.     for (int i=0; i<index; i++){   
  57.       if (peeks[i] == peekNumber){   
  58.         return true;   
  59.       }   
  60.     }   
  61.     return false;   
  62.   }   
  63.   
  64.   /**  
  65.    * 取得某一顶点的数值  
  66.    * 根据推导公式:  
  67.    * A4=18-A1-A2-A3;A6=18-A1-A2-A5;A7=18-A1-A3-A5;A8=2*A1+A2+A3+A5-18;  
  68.    * 这里取 A1=1  
  69.    * @param peek int  顶点标号  
  70.    * @return int 顶点数值  
  71.    */  
  72.   public static int getPeekNumber(int peek, int[] peeks) {   
  73.     switch (peek) {   
  74.       case 0:   
  75.         return 1;   
  76.       case 3:   
  77.         return 17 - peeks[1] - peeks[2];   
  78.       case 5:   
  79.         return 17 - peeks[1] - peeks[4];   
  80.       case 6:   
  81.         return 17 - peeks[2] - peeks[4];   
  82.       case 7:   
  83.         return peeks[1] + peeks[2] + peeks[4] - 16;   
  84.       default:   
  85.         return 0;   
  86.     }   
  87.   }   
  88. }   


算法特性:
因为该算法是根据分析问题的数学模型,找到路径规律,然后直接推导答案,而不是采用通过遍历每一种可能性进行判断,所以效率比较好 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值