usaco月赛MOOCRYPT

MOOCRYPT
MOOCRYPT
牛是很喜欢迷,尤其是字谜。农民约翰的奶牛最近创造了一个有趣的“发现单词”难题。这样一个谜题的一个例子是:
USOPEN
OOMABO
MOOMXO
PQMROM
作为牛,他们唯一感兴趣的是“MOO”,它可以出现在搜索这个词在很多地方,水平、垂直或对角线。上面的示例包含6个MOO。
农民约翰也是一个字谜的粉丝。因为牛不想让约翰在牛没有尝试前解决难题,,他们已经加密使用“替换密码”,替换每个字母的字母是不同的。例如,A可能映射到X,B可能映射到A,等等。没有字母替换自己本身,也没有两个字母映射到相同的字母(因为否则解密将模糊)。
不幸的是,牛已经失去了解决难题的替换密码。请帮助他们确定MOO的最大数量,可能存在于一个替换密码替换过的难题。
输入格式(文件moocrypt.in):
输入的第一行包含N和M,描述问题的行和列的数量(最多50)。每个包含M字符下N行,描述一行加密的难题。每个字符是一个大写字母在A. . Z。
输出格式(文件moocrypt.out):
请输出中包含的最大数量的MOO。
样例输入:
4 6
TAMHGI
MMQVWM
QMMQSM
HBQUMQ
样例输出:
6
这是和问题叙述中相同的谜题。这里的“M”和“O”被替换为“Q”和“M”。

题解

好吧,这道题完全是暴力。
暴力枚举可能变为的字串,必须满足条件。
然后暴力枚举该字串的数量,取最大值。

#include
#include
#include 
#include
#include
using namespace std;
vector<string> A;
int N,M;
int dr[]={-1,-1,-1,0,1,1,1,0};
int dc[]={-1,0,1,1,1,0,-1,-1};
char get(int r,int c)
{
    if(r<0||N<=r||c<0||M<=c)
    return '_';
    return A[r][c]; 
}
int main()
{
    cin>>N>>M;
    A.resize(N);
    for(int i=0;icin>>A[i];
    int best=0;
    for(char mch='A';mch<='Z';mch++)
    {
        if(mch=='M')continue;
        for(char och='A';och<='Z';och++)
        {
            if(och=='O'||mch==och)continue;
            int result=0;
            for(int i=0;ifor(int j=0;jif(get(i,j)!=mch)continue;
                for(int k=0;k<8;k++)
                {
                    if(get(i+1*dr[k],j+1*dc[k])==och&&
                       get(i+2*dr[k],j+2*dc[k])==och)
                    result++; 
                }
              }
              best=max(best,result);
        }
    }
    cout<return 0;
    }

你可能感兴趣的:(usaco月赛MOOCRYPT)