关键词:
考虑实用性优先,能不用if for循环就不用
题目:
小明最近在教邻居家的小朋友小学奥数,而最近正好讲述到了三阶幻方这个部分。
三阶幻方指的是将1~9不重复的填入一个3*3的矩阵当中,使得每一行、每一列和每一条对角线的和都是相同的。 三阶幻方又被称作九宫格,在小学奥数里有一句非常有名的口诀: “二四为肩,六八为足,左三右七,戴九履一,五居其中”, 通过这样的一句口诀就能够非常完美的构造出一个九宫格来。 4 9 2 3 5 7 8 1 6 有意思的是,所有的三阶幻方,都可以通过这样一个九宫格进行若干镜像和旋转操作之后得到。 现在小明准备将一个三阶幻方(不一定是上图中的那个)中的一些数抹掉,交给邻居家的小朋友来进行还原,并且希望她能够判断出究竟是不是只有一个解。 而你呢,也被小明交付了同样的任务,但是不同的是,你需要写一个程序~ 输入格式: 输入仅包含单组测试数据。 每组测试数据为一个3*3的矩阵,其中为0的部分表示被小明抹去的部分。 对于100%的数据,满足给出的矩阵至少能还原出一组可行的三阶幻方。 输出格式: 如果仅能还原出一组可行的三阶幻方,则将其输出,否则输出“Too Many”(不包含引号)。 样例输入 0 7 2 0 5 0 0 3 0 样例输出 6 7 2 1 5 9 8 3 4
解决思路:
1 package com.algorithm.java.blueBirdge; 2 3 //import static sun.misc.Version.println; 4 5 import com.sun.org.apache.bcel.internal.generic.RETURN; 6 /* 7 * 4 9 2 8 * 3 5 7 9 * 8 1 6 10 * */ 11 12 /* 13 * 0 7 2 14 * 0 5 0 15 * 0 3 0*/ 16 public class testsuanfa { 17 //标准串的每一位是不是和s中的匹配上了 18 static boolean test(String std,String s){ 19 for(int i=0;i<std .length();i++){ 20 if(std.charAt(i)==s.charAt(i)) continue;//如果匹配上了,看下一个,continue 21 if(s.charAt(i)==‘0‘) continue;//如果要求串是0 ,则可以和标准串中的任何一个匹配 22 return false; 23 } 24 return true; 25 } 26 27 public static void main(String[] args){ 28 29 String s="072050030";//用要求的串进行匹配 30 //将所有可能的矩阵的形式用一个串表示 31 String[] ss ={ //旋转产生4种,镜像产生4种,共8种 32 "492357816", 33 "834159672", 34 "618753294", 35 "276951438", 36 37 "294753618", 38 "438951276", 39 "816357492", 40 "672159834" 41 }; 42 //匹配 43 for(int i=0;i<ss.length;i++){ 44 if(test(ss[i],s)){ 45 //将字符串中的数仍然提取出来,以矩阵的形式输出 46 System.out.println(ss[i].substring(0,3)); 47 System.out.println(ss[i].substring(3,6)); 48 System.out.println(ss[i].substring(6,9)); 49 50 51 } 52 53 } 54 55 56 } 57 58 59 60 }