[usaco]Name That Number题解

题目:

每只奶牛有一个数字编号,现在给他们取名字,数字对应字母如下:
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    (没有Q和Z)
那么比如说编号为4734的奶牛一共可以有81个名字,然而题目还给了一个dict.txt文件,里面有四千多名字供你选择,当然也只能在里面选择。最后输出可能的名字,没有则输出NONE

题解:

刚开始我想的是根据这个数字转换出可能的名字,然后逐个到文件里的名字里去找相同的。很显然超时了……大概就是3^12的可能性?然后想了一个其他方法,先把那四千多个名字翻译成数字,然后直接比对所给的数字。结果几乎不需要时间,不管你几位数都是一样的。而且要不是他的字母和数字转换缺三少四没有规律的话,这个代码真的只要几行……中间百度了文件读取的方法看了一下。

代码:

/*
ID: xcwhkh1
LANG: C
TASK: namenum
*/
#include <stdio.h>
#include<string.h>
char name[5000][13];
//1=49,A=65
int main () {
FILE *fin1  = fopen ("dict.txt", "r");
FILE *fin  = fopen ("namenum.in", "r");
FILE *fout  = fopen ("namenum.out", "w");
char a[13];
char temp[13];
memset(a,0,13);
fscanf(fin,"%s",a);
int i,flag=0;
for(i=0;i<4617;i++)
{
fscanf(fin1,"%s\n",name[i]);
strcpy(temp,name[i]);//先保存一个副本用于比较
for(int j=0;j<strlen(name[i]);j++)
{
if(name[i][j]=='A'||name[i][j]=='B'||name[i][j]=='C')
name[i][j]='2';
if(name[i][j]=='D'||name[i][j]=='E'||name[i][j]=='F')
name[i][j]='3';
if(name[i][j]=='G'||name[i][j]=='H'||name[i][j]=='I')
name[i][j]='4';
if(name[i][j]=='J'||name[i][j]=='K'||name[i][j]=='L')
name[i][j]='5';
if(name[i][j]=='M'||name[i][j]=='N'||name[i][j]=='O')
name[i][j]='6';
if(name[i][j]=='P'||name[i][j]=='R'||name[i][j]=='S')
name[i][j]='7';
if(name[i][j]=='T'||name[i][j]=='U'||name[i][j]=='V')
name[i][j]='8';
if(name[i][j]=='W'||name[i][j]=='X'||name[i][j]=='Y')
name[i][j]='9';
if(name[i][j]=='Q'||name[i][j]=='Z')
name[i][j]='1';
}
if(strcmp(a,name[i])==0)
{
flag=1;
fprintf(fout,"%s\n",temp);
}
}
if(flag==0)
fprintf(fout,"NONE\n");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值