许多人都不知道,奶牛很喜欢拼图,特别是单词拼图。
农夫约翰的奶牛最近发明了一个有趣的“单词查找器”拼图。
这种拼图的一个例子是:
USOPEN OOMABO MOOMXO PQMROM 作为奶牛,它们唯一感兴趣的单词是 MOO,它可以在拼图中多次沿水平、垂直、45度斜线或135度斜线出现。
上例中,MOO 一共出现了 6 次。
农夫约翰也是个拼图迷,由于奶牛们不希望他在它们之前解决“单词查找器”拼图,因此它们使用”替换密码“对内容进行了加密。
该“替换密码”用不同的字母替换了字母表中的每个字母。
例如,A 可以映射到 X,B 可以映射到 A,依此类推。
没有字母映射到自身,也没有两个字母映射到同一个字母(否则解将是不明确的)。
不幸的是,奶牛忘记了替换密码的具体加密方式。
请帮助它们确定如果使用适当的替换密码解密,谜题中可能存在的最大 MOO 数。
输入格式
第一行包含 N,M,表示拼图的尺寸为 N 行 M 列。
接下来 N 行,每行包含 M 个大写字母,形容加密后的拼图。
输出格式
输出如果使用适当的替换密码解密,谜题中可能存在的最大 MOO 数。
数据范围
1≤N,M≤50
输入样例:
4 6
TAMHGI
MMQVWM
QMMQSM
HBQUMQ
输出样例:
6
样例解释 在此样例中,M 和 O 分别被替换为了 Q 和 M。
以此解密最多可存在 6 个 MOO。
代码:
// 寻找八个方向中 ABB形式的相同字符串个数的最大值
#include <bits/stdc++.h>
using namespace std;
const int N = 55;
char g[N][N];
int n, m;
int ne[8][2] = {{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1}};
unordered_map<string, int> mp;
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> g[i] + 1;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
for (int k = 0; k < 8; k++)
{
int x = i, y = j;
string str;
str = str + g[x][y];
bool flag = 1;
for (int u = 0; u < 2; u++)
{
x += ne[k][0], y += ne[k][1];
if (x < 1 || x > n || y < 1 || y > m)
{
flag = 0;
break;
}
str += g[x][y];
}
if (flag && str[0] != str[1] && str[1] == str[2] && str[0] != 'M' && str[1] != 'O')
mp[str]++;
}
}
}
int res = 0;
for (auto it : mp)
res = max(res, it.second);
cout << res;
return 0;
}
|