关于“三阶幻方”算法的Java实现
2015-02-03 19:38
246 查看
/*算法分析:
* 名称:三阶幻方
* 题目:试将1~9这9个不同的整数填入一个3x3的表格,使每行,每列,以及每条对角线上的数字之和相同。
* 解析思路:
* 要满足题目中的条件,那么,数字之和必为15,数字5必定是中间的那个数。
* 1.将剩下的数分为几组(1,9),(2,8),(3,7),(4,6)
* 在表格中,这些数字与中间的数字连线会有对应关系通过这些对应关系来得到我们想要的结果。
* 2.将表格编号从左到右,从下到上依次为0~8,
* 3.遍历所有的数字:
* 从第0个格子开始,这个数可以是5之外的任何数,但是,这个数确定后,与之对应的8号格子的数字也就确定了。
* 填充第1个格子,这个格子中的数字可以是除去5,0号格子,8号格子之外的数,找到这个格子的数后,第7号格子的数也就确定了。
* 0号和1号可以确定2号格子的数字,2号格子的数字确定后,6号格子的数字也就确定了。
* 6号格子和0号格子可以确定3号格子的数字,从而确定5号格子的数字,
* 这样,所有格子的数字都确定了,最后检测6,7,8是否符合规则(即,和是否为15),2,5,8是否符合规则,如果都符合那么这就是我们
* 要的结果了。
* */
* 名称:三阶幻方
* 题目:试将1~9这9个不同的整数填入一个3x3的表格,使每行,每列,以及每条对角线上的数字之和相同。
* 解析思路:
* 要满足题目中的条件,那么,数字之和必为15,数字5必定是中间的那个数。
* 1.将剩下的数分为几组(1,9),(2,8),(3,7),(4,6)
* 在表格中,这些数字与中间的数字连线会有对应关系通过这些对应关系来得到我们想要的结果。
* 2.将表格编号从左到右,从下到上依次为0~8,
* 3.遍历所有的数字:
* 从第0个格子开始,这个数可以是5之外的任何数,但是,这个数确定后,与之对应的8号格子的数字也就确定了。
* 填充第1个格子,这个格子中的数字可以是除去5,0号格子,8号格子之外的数,找到这个格子的数后,第7号格子的数也就确定了。
* 0号和1号可以确定2号格子的数字,2号格子的数字确定后,6号格子的数字也就确定了。
* 6号格子和0号格子可以确定3号格子的数字,从而确定5号格子的数字,
* 这样,所有格子的数字都确定了,最后检测6,7,8是否符合规则(即,和是否为15),2,5,8是否符合规则,如果都符合那么这就是我们
* 要的结果了。
* */
public static void threeMap(){ MapEle eleArray[] = new MapEle[9] ; eleArray[4] = new MapEle(1,1,5) ; for(int i = 0 ; i < eleArray.length ; i++){ if(i == 4){ continue ; } int row = 0 ; int col = 0 ; row = i / 3 ; col = i % 3 ; eleArray[i] = new MapEle(row,col,0) ; } for(int i = 1 ; i <= 9 ; i++){ if(i == 5){continue ;} eleArray[0].setValue(i) ; eleArray[8].setValue(getTweenNum(i)) ; for(int j = 1 ; j <= 9; j++) { if(j == 5 || j == i || j == getTweenNum(i)) {continue ;} eleArray[1].setValue(j) ; eleArray[7].setValue(getTweenNum(j)) ; int tempNum = 15 - i - j ; if(tempNum > 9 || tempNum < 1 || tempNum == 5){continue ;} eleArray[2].setValue(15 - i - j); eleArray[6].setValue(getTweenNum(15 - i - j)) ; tempNum = 15 - i - getTweenNum(15 - i - j) ; if(tempNum > 9 || tempNum < 1 || tempNum == 5){continue ;} eleArray[3].setValue(15 - i - getTweenNum(15 - i - j)); eleArray[5].setValue(getTweenNum(eleArray[3].getValue())) ; //检测是否合格,如果合格,那么输出数组,如果不合格,继续检测。 if(eleArray[6].getValue() + eleArray[7].getValue() + eleArray[8].getValue() == 15 && eleArray[2].getValue() + eleArray[5].getValue() + eleArray[8].getValue() == 15){ for(int k = 0 ; k < eleArray.length ; k++){ System.out.print(eleArray[k].getValue() + ","); } System.out.println(); } } } } public static int getAgnistNum(int _num){ int num = -1 ; switch(_num){ case 0: num = 2 ; break; case 1: num = 1 ; break; case 2: num = 0 ; break; default: num = -1 ; System.out.println("AgainstNumError:" + _num); } return num ; } public static int getTweenNum(int num) { switch (num) { case 1: return 9 ; case 2: return 8 ; case 3: return 7 ; case 4: return 6 ; case 6: return 4 ; case 7: return 3 ; case 8: return 2 ; case 9: return 1 ; default: System.out.println("ErrorTweenNum:" + num); return 0 ; } }
相关文章推荐
- 关于“泊松分酒”的算法理解,实现遍历所有情况(JAVA)
- 关于AES算法及JAVA中的实现
- 关于《射雕英雄传》的数学算法问题 JAVA实现
- 关于用java io实现文件压缩与解压(不涉及压缩算法)
- 关于烙饼排序问题的算法与Java实现
- 关于乘方的优化算法(java实现)
- [JsonSchema] 关于接口测试 Json 格式比对核心算法实现 (Java 版)
- java实现的18位身份证格式验证算法
- 操作系统进程调用的5种算法 java实现
- 在java中实现图形学中的椭圆算法
- AIX 程序设计大赛-AIX正方形问题算法及Java程序实现(方案三)
- 关于电梯算法的C++实现(zt)
- 关于高精度正整数计算的JAVA实现
- FIFO与LRU 算法实现(java)
- java实现的18位身份证格式验证算法
- AIX 程序设计大赛-AIX正方形问题算法及Java程序实现
- java实现的18位身份证格式验证算法
- 图像边缘检测(Canny 算法)的Java实现
- Java中的几种算法的实现
- 一个用Dijkstra算法实现的路由算法的java程序——1 GraphAdjList类