持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第20天,点击查看活动详情。
哞加密
题目描述
许多人都不知道,奶牛很喜欢拼图,特别是单词拼图。
农夫约翰的奶牛最近发明了一个有趣的“单词查找器”拼图。
这种拼图的一个例子是:
USOPEN
OOMABO
MOOMXO
PQMROM
作为奶牛,它们唯一感兴趣的单词是 MOO,它可以在拼图中多次沿水平、垂直、45度斜线或135度斜线出现。
上例中,MOO 一共出现了 66 次。
农夫约翰也是个拼图迷,由于奶牛们不希望他在它们之前解决“单词查找器”拼图,因此它们使用”替换密码“对内容进行了加密。
该“替换密码”用不同的字母替换了字母表中的每个字母。
例如,AA 可以映射到 XX,BB 可以映射到 AA,依此类推。
没有字母映射到自身,也没有两个字母映射到同一个字母(否则解将是不明确的)。
不幸的是,奶牛忘记了替换密码的具体加密方式。
请帮助它们确定如果使用适当的替换密码解密,谜题中可能存在的最大 MOO 数。
输入格式
第一行包含 N,MN,M,表示拼图的尺寸为 NN 行 MM 列。
接下来 NN 行,每行包含 MM 个大写字母,形容加密后的拼图。
输出格式
输出如果使用适当的替换密码解密,谜题中可能存在的最大 MOO 数。
数据范围
1≤N,M≤501≤N,M≤50
输入样例:
4 6
TAMHGI
MMQVWM
QMMQSM
HBQUMQ
输出样例:
6
样例解释
在此样例中,MM 和 OO 分别被替换为了 QQ 和 MM。
以此解密最多可存在 66 个 MOO。
代码:
import java.util.*;
public class Main{
static int N = 60;
static int n,m;
static Map<String,Integer> map = new HashMap<>();
static char[][] g = new char[N][N];
static int[] dx = {0,1,1,1,0,-1,-1,-1};
static int[] dy = {1,1,0,-1,-1,-1,0,1};
public static void getnum(int x,int y){
for (int i = 0 ; i < 8 ; i ++ ){
int a1 = x + dx[i];
int b1 = y + dy[i];
int a2 = a1 + dx[i];
int b2 = b1 + dy[i];
if (a1 >= 0 && a1 < n && b1 >= 0 && b1 < m && a2 >= 0 && a2 < n && b2 >= 0 && b2 < m){
if (g[a1][b1] == g[a2][b2] && g[a1][b1] != g[x][y]){
String s = "";
s += g[x][y];
s += g[a1][b1];
if(map.get(s) == null) map.put(s,1);
else map.put(s,map.get(s) + 1);
}
}
}
}
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
n = scan.nextInt();
m = scan.nextInt();
for (int i = 0 ; i < n; i ++ ){
String s = scan.next();
for (int j = 0 ; j < m ; j ++ ){
g[i][j] = s.charAt(j);
}
}
for (int i = 0; i < n ; i ++ ){
for (int j = 0 ; j < m ; j ++ ){
getnum(i,j);
}
}
int res = 0;
for (String key : map.keySet()){
if (key.charAt(1) == 'O'){
continue;
}
res = Math.max(res, map.get(key));
}
System.out.println(res);
}
}