Description
众所不知的,奶牛们很喜欢玩智力游戏。John农夫最近发明了一个有趣的“找单词”游戏。 这个游戏的例子如下:
USOPEN
OOMABO
MOOMXO
PQMROM
作为奶牛,他们只对单词“MOO”有兴趣,这个可能会出现在找单词游戏中的任何地方,可能是水平的,可能是垂直的,也有可能是对角线的出现,也就是找相邻四个位置和对角线位置。上面的例子出现了6个MOO。
John农夫也是单词游戏的粉丝。 由于奶牛们不想在他们有机会试一下之前,John就把解开了,他们把游戏的内容用一个代替密码给加密了。这个代替密码将字母表里的每个字母用另外一个字母代替了。比如说,A可能对应着X, B可能对应着A等等。没有哪个字母和自己对应,没有两个字母对应到同样一个字母上(否则解码时会引起歧义)。
不幸的是,这群傻奶牛不记得用来解码的代替密码了。 所以求求你帮他们找到一个合适的代替密码,使这个游戏中出现MOO的次数最多。
Input
第一行包括N和M, 分别表示这个游戏的行与列(每个最多50)。 接下来的N行,每行包括M个字符,来表示这个游戏的一行。每个字符都是从A-Z之间的一个大写字母。
Output
输出当游戏用合适的代替密码解码后可以出现的最多MOO的次数
Samples
Input
4 6
TAMHGI
MMQVWM
QMMQSM
HBQUMQ
Output
6
Hint
【样例解释】 这个就是题目描述中的加密后的游戏。 这里M和O分别用Q和M代替了。
思路
枚举MO的所有加密情况,对每种情况dfs
代码
int dx[] = {0,-1, -1, -1, 0, 1, 1, 1, 0};
int dy[] = {0,-1, 0, 1, 1, 1, 0, -1, -1};
char a[100][100];
int n,m;
char MM,OO;
int ans=0;
struct node{
int x;
int y;
};
void bfs(){
int cnt=0;
queue<node>q;
for(int k=1;k<=n;k++){
for(int g=1;g<=m;g++){
if(a[k][g]==MM){
q.push({k,g});
}
}
}
while(!q.empty()){
node tmp=q.front();
q.pop();
for(int i=1;i<=8;i++){
int nx=tmp.x+dx[i];
int ny=tmp.y+dy[i];
int nnx=tmp.x+dx[i]*2;
int nny=tmp.y+dy[i]*2;
if(nx<1||nx>n||ny<1||ny>m||nnx<1||nnx>n||nny<1||nny>m){
continue;
}
if(a[nx][ny]==OO&&a[nnx][nny]==OO){
cnt++;
}
}
}
ans=max(ans,cnt);
//cout<<cnt<<" "<<MM<<" "<<OO<<" "<<endl;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=26;i++){
for(int j=1;j<=26;j++){
if(i!=j&&i!=13&&j!=15){
MM=char(i-1+'A');
OO=char(j-1+'A');
//printf("%c %c\n",MM,OO);
bfs();
}
}
}
printf("%d\n",ans);
}