USACO解析name that number篇

来源:互联网 发布:淘宝首页全屏尺寸 编辑:程序博客网 时间:2024/06/05 00:26
题目大意:
常规的手机键盘上,拨号键上面的每一个数字都代表了3个字母,所以输入一组数字之后会产生很多个字母组合,现在给你一个字典,字典里面的名字都按照字母顺序排好了,要求你输入1~12个数字,然后输出与字典里面相同的字母组合,如果没有在字典里查找到相同的字母组合,就输出“NONE”
解题思路:
常规的解法是,先生成这些数字能够生成的字母组合,然后再逐一到字典里面比对,这样做不会超时。另一种算法效率比较高的方法就是,只比对每个字母所代表的数字,这样只需要直接搜索字典里面符合数字的字母组合就行
/*ID: huangxi16LANG: C++TASK: namenum*/#include <stdio.h>#include <string.h>//key 每个字母对应的按键号  int key[28]= {2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,0,7,7,8,8,8,9,9,0};//num 存放输入的数字char num[20];int main(){    //s 存放从字典里读入的字符串char s[200];    freopen("namenum.in","r",stdin);    freopen("namenum.out","w",stdout);    scanf("%s",num);//n 计算输入输入数字的长度    int n=strlen(num);//标记字典里是否有对应的名字    int count=0;    freopen("dict.txt","r",stdin);    while(scanf("%s",s)!=EOF)    {        int m=0;        m=strlen(s);//这里做了一个优化,只有从字典读入的字符串长度和输入数字的长度一样时,才进行处理        if(n==m)        {//利用ascii码加减进行按位比对,注意m必须不小于0            while(num[n-m]-48==key[s[n-m]-'A']&&m>=0)            {                m--;                if(0==m)                {                    printf("%s\n",s);                    count++;                }            }        }    }    if(0==count)        printf("NONE\n");    return 0;}

原创粉丝点击