1.题目原文
有一个 N×N(N 为奇数,且1≤N≤10)的矩阵,矩阵中的元素都是字符。这个矩阵可能会按照如下的几种变幻法则之一进行变幻(只会变幻一次)。
现在给出一个原始的矩阵,和一个变幻后的矩阵,请编写一个程序,来判定原始矩阵是按照哪一种法则变幻为目标矩阵的。
- 按照顺时针方向旋转 90 度; 如:
2. 按照逆时针方向旋转 90 度; 如:
3.中央元素不变(如下例中的 5),其他元素(如下例中的 3)与 "以中央元素为中心的对应元素"(如下例中的 7)互换; 如:
4.保持原始矩阵,不变幻;
5.如果从原始矩阵到目标矩阵的变幻,不符合任何上述变幻,请输出 5。
输入格式
第一行:矩阵每行/列元素的个数 N;
第二行到第 N+1 行:原始矩阵,共 N 行,每行 N 个字符;
第 N+2 行到第 2×N+1 行:目标矩阵,共 N 行,每行 N 个字符;
输出格式
只有一行,从原始矩阵到目标矩阵的所采取的变幻法则的编号。
输出时每行末尾的多余空格,不影响答案正确性
样例输入
5 a b c d e f g h i j k l m n o p q r s t u v w x y y x w v u t s r q p o n m l k j i h g f e d c b a
样例输出
3
2.解题思路
1.如果给出的矩阵长度为1直接输出4,因为无论怎么改变他还是原样,2.使用两个字二维符数组aa和bb接受两个矩阵,3.写一个方法判断aa和bb是进过怎样的变化,4.方法的实现思路是取出第一个数组的第一列,与第二个数值的第一行,第一列,最后一行,最后一列。如果与第一行匹配则返回4(没变化),与第—列匹配则返回2(逆时针90度),与最后一列匹配返回1(顺时针90度),与最后一行匹配3(中央元素不变,其他对应交换),都不匹配返回5.
3.代码实现
mport java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
char [][] aa = new char[N][N];
String first = "";
for (int i = -1; i < N; i++) {
String temp = scanner.nextLine();
temp = temp.replace(" ", "");
if(i==0)first = temp.substring(0,1);
if(i==-1)continue;
aa[i] = temp.toCharArray();
}
int a = 0;
char [][] bb = new char[N][N];
for (int i = 0; i < aa.length; i++) {
String tempString = scanner.nextLine();
tempString = tempString.replace(" ", "");
bb[i] = tempString.toCharArray();
}
System.out.println(compare(aa, bb));
}
public static int compare(char [][] arr,char [][] brr) {
if (arr.length==1) {
return 4;
}
String aa = "";
String bb = "";
String cc = "";
String dd = "";
String ee = "";
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
ee += brr[i][j];
aa += arr[i][j];
bb += brr[j][arr.length-i-1];
cc += brr[arr.length-j-1][i];
dd += brr[arr.length-i-1][arr.length-j-1];
}
if(aa.equals(bb)) return 1;
else if(aa.equals(cc)) return 2;
else if(aa.equals(dd)) return 3;
else if(aa.equals(ee)) return 4;
else return 5;
}
return 5;
}
}