算法题(哞加密)

149 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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);
    }
}