LDU---2021年初寒假训练第8场 B.MOO游戏

本文介绍了一位农夫John如何利用智力游戏'找单词'娱乐奶牛,奶牛们对'MOO'这个词特别感兴趣。挑战在于通过替换字母的加密密码找出解码方案,使得游戏中的MOO出现次数最多。解码过程涉及字符替换和深度优先搜索策略。
摘要由CSDN通过智能技术生成

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);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值