Name That Number

Name That Number

Description

在威斯康辛州牛守志大农场经营者之中,都习惯于请会计部门用连续数字给奶牛打上烙印。然而,奶牛们并不认为这个档案系统是一种优势,它们希望用它们喜欢的名字来呼叫它们的同伴,而不是用像这个的语句"C’mon, #4364, get along."。
请写一个程序来帮助可怜的牧牛工将一只奶牛的烙印编号翻译成一个可能的名字。因为母牛们现在都有蜂窝式马鞍电话了,使用标准的按键的排布来把将数目翻译为文字:( 除了 “Q” 和 “Z”)

2: A,B,C     5: J,K,L    8: T,U,V
3: D,E,F     6: M,N,O    9: W,X,Y
4: G,H,I     7: P,R,S

可接受的名字都被放在这样一个叫作"dict.txt" 的文件中,它包含一连串的少于 5,000个可被接受的牛的名字(所有的名字都是大写的且已按字典序排列)。
例如,编号4734产生以下所有名称:

GPDG GPDH GPDI GPEG GPEH GPEI GPFG GPFH GPFI GRDG GRDH GRDI
GREG GREH GREI GRFG GRFH GRFI GSDG GSDH GSDI GSEG GSEH GSEI
GSFG GSFH GSFI HPDG HPDH HPDI HPEG HPEH HPEI HPFG HPFH HPFI
HRDG HRDH HRDI HREG HREH HREI HRFG HRFH HRFI HSDG HSDH HSDI
HSEG HSEH HSEI HSFG HSFH HSFI IPDG IPDH IPDI IPEG IPEH IPEI
IPFG IPFH IPFI IRDG IRDH IRDI IREG IREH IREI IRFG IRFH IRFI
ISDG ISDH ISDI ISEG ISEH ISEI ISFG ISFH ISFI

碰巧的是,在这81个名称中只有一个“GREG”是在有效名字文件中可被接受的,即只有“GREG”在文件中有出现。
编写一个程序,给出奶牛的编号,打印可以从编号生成的所有有效名字,如果没有有效名字,则打印“NONE”。序列号可以长达十几位数。

PROGRAM NAME: namenum

INPUT FORMAT

一行,长度为1到12位。

SAMPLE INPUT (file namenum.in)

4734

OUTPUT FORMAT

可以从输入生成的有效名称列表,每行一个,按升序字母顺序排列。

SAMPLE OUTPUT(文件名num.out)

GREG

设计算法:

这道题题意理解是一大难点,全英文看着有点费劲,上面的翻译参考了洛谷上面的,应该是讲清楚了。理解清楚了的话那应该就比较简单了。有两种想法:
1、把数字编号换成字母编号然后拿去和有效名字文件中的名字做对比。
2、把有效名字文件中的名字转换为数字编号来做对比。
显然,方法二的工作量是要少一点的,不过方法一应该也能做,但是效率相对较低,比对的时候,如果真的是12位,算算要3的12次方,这个数字想想就不小,所以方法二更优。

C++编写:

/*
ID:  your_id_here
TASK: namenum
LANG: C++                 
*/
#include<iostream>
#include<cstdio>
#include<fstream>
#include<string>
using namespace std;


string s="2223334445556667077888999";

int main()
{
    freopen("namenum.in","r",stdin);
    freopen("namenum.out","w",stdout);
    string num,str,temp;
    bool flag=true;
    cin>>num;
    ifstream din("dict.txt");
    while(din>>str)
    {
        int len=str.size();
        temp="";
        if(len==num.size())           //位数不同直接跳过
        {
            for(int i=0;i<len;i++)    //字母转换为数字
            {
                temp+=s[str[i]-'A'];
            }
            if(temp==num)             
            {
                cout<<str<<endl;
                flag=false;
            }
        }
    }
    if(flag)
        cout<<"NONE"<<endl;

    return 0;
}

另附USACO参考代码(感觉挺麻烦的):
ANALYSIS

发布了82 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Slatter/article/details/100055722