USACO 1.2.2 方块转换 JAVA

    科技2022-07-14  134

    这不是一道困难的题目,当然如果你之前没有什么做题也许会遇到一些问题,不过保持耐心你就可以搞定这道题了。

    同样,这也是我第二次写这道题了,几个月前我用C++写得有些凌乱,这次我想用JAVA写得优雅一些。

    首先你要输入数据:记录下大小,保存转前和转后的矩阵。接下来你要做的只是验证转后与转前每个元素的坐标符合什么样的关系就行了。仅此而已。

    package judgeSquareTrans; import java.util.Scanner; //输入数据 // 输入大小 // 存入before // 存入 after // //需要函数 // 1顺时针90度验证 // 2顺时针180度验证 // 3顺时针270度验证 // 4镜像验证 // 5镜像+ 顺时针旋转验证(将调用1-3) // 6不变验证 // 7无效转换验证(上述均不成立) public class Main { static final int MAXN= 15; static int n= 0; static String[] beforeArray= new String[MAXN]; static String[] afterArray= new String[MAXN]; //方便矩阵计算 static int arrayN; public static void main(String[] args) { Scanner console= new Scanner(System.in); n= console.nextInt(); arrayN= n-1; //接收数据 for(int i=0; i<n; i++) { beforeArray[i]= console.next(); } for(int i=0; i<n; i++) { afterArray[i]= console.next(); } System.out.println(judge()); } public static int judge() { if(judge1()) return 1; else if(judge2()) return 2; else if(judge3()) return 3; else if(judge4()) return 4; else if(judge5()) return 5; else if(judge6()) return 6; else return 7; } //判断第一种 public static boolean judge1() { for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { if(afterArray[j].charAt(arrayN-i)!=beforeArray[i].charAt(j)) { return false; } } } return true; } //判断第二种 public static boolean judge2() { for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { if(afterArray[arrayN-i].charAt(arrayN-j)!=beforeArray[i].charAt(j)) { return false; } } } return true; } //判断第三种 public static boolean judge3() { for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { if(afterArray[arrayN-j].charAt(i)!=beforeArray[i].charAt(j)) { return false; } } } return true; } //判断第四种 public static boolean judge4() { for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { if(afterArray[i].charAt(arrayN-j)!=beforeArray[i].charAt(j)) { return false; } } } return true; } //判断第五种 //先生成镜像 镜像更新beforeArray public static boolean judge5() { StringBuffer[] mirrorArray= new StringBuffer[MAXN]; //实例化元素 不然下面append的时候会空指针报错 for(int i=0; i<n; i++) { mirrorArray[i]= new StringBuffer(); } //生成镜像 for(int i=0; i<n; i++) { mirrorArray[i].append(beforeArray[i]); mirrorArray[i].reverse();//镜像行不变 只是列相反 } //将镜像导入beforeArray 使得函数可以调用 for(int i=0; i<n; i++) { beforeArray[i]= mirrorArray[i].toString(); } if(judge1()||judge2()||judge3()) return true; else return false; } //判断第六种 public static boolean judge6() { //在5中已经转了一次镜像 所以如果现在是镜像那么就表示根本没进行变换 return judge4(); } }

    比较有趣的部分在于针对JAVA的特性上。

    首先,JAVA没法一个字一个字地读入,所以那就干脆用一维的字符串数组取代C++常用的二维字符数组。

    另一方面,主要是在第五个变换关系的验证: 我想我无论如何也不想把judge1-3重新写一遍,所以我决定不妨直接更新beforeArray这个数组。 这时候你会发现同样没法方便地逐字在原地形成镜像,所以不如用一个StringBuffer数组先一行一行地复制beforeArray,然后直接调用StringBuffer的reverse函数,之后再把值完整地赋回beforeArray的每一行。

    它真的占了很大的内存啊

    Processed: 0.014, SQL: 8