Name That Number(USACO)

/* ID:tianlin2 PROG:namenum LANG:C++ */ #include <iostream> #include <string> #include <fstream> #include <cmath> using namespace std; int main() { ofstream fout("namenum.out"); ifstream fin("namenum.in"); //m保存所对应名字的个数 long int m=0; //a保存输入的数字,c则保存字典里字符串所对应的数字,b则保存每个字母所对应的数字 //用string而不用int保存数字可防止越界问题,处理起来也更方便 string a,b,c; string dict[5000]; ifstream infi("dict.txt"); for(int i=0;i!=5000;++i) infi>>dict[i]; infi.close(); fin>>a; for(int i=0;i!=5000;++i) { if(dict[i].size()!=a.size()) continue; c=""; string::iterator it; for(it=dict[i].begin();it!=dict[i].end();++it) { if(*it>='A'&&*it<='C') b="2"; else if(*it>='D'&&*it<='F') b="3"; else if(*it>='G'&&*it<='I') b="4"; else if(*it>='J'&&*it<='L') b="5"; else if(*it>='M'&&*it<='O') b="6"; else if(*it=='P'||*it=='R'||*it=='S') b="7"; else if(*it>='T'&&*it<='V') b="8"; else if(*it>='W'&&*it<='Y') b="9"; else break; c=c+b; } if(c==a) { fout<<dict[i]<<endl; ++m; } } if(m==0) fout<<"NONE"<<endl; //system("pause"); return 0; }

主要算法是在dict.txt开始搜索,看每个字母所产生的数字是否和a匹配!

注意string类型的拼接,若:

string c;

char b='a';

c=c+b;  //OK

c+=b; //error

 

官方答案(注意map的用法):

#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE *in = fopen ("namenum.in", "r"); FILE *in2 = fopen ("dict.txt", "r"); FILE *out = fopen ("namenum.out","w"); int nsolutions = 0; int numlen; char word[80], num[80], *p, *q, map[256]; int i, j; map['A'] = map['B'] = map['C'] = '2'; map['D'] = map['E'] = map['F'] = '3'; map['G'] = map['H'] = map['I'] = '4'; map['J'] = map['K'] = map['L'] = '5'; map['M'] = map['N'] = map['O'] = '6'; map['P'] = map['R'] = map['S'] = '7'; map['T'] = map['U'] = map['V'] = '8'; map['W'] = map['X'] = map['Y'] = '9'; fscanf (in, "%s",num); numlen = strlen(num); while (fscanf (in2, "%s", word) != EOF) { for (p=word, q=num; *p && *q; p++, q++) { if (map[*p] != *q) break; } if (*p == '/0' && *q == '/0') { fprintf (out, "%s/n", word); nsolutions++; } } if (nsolutions == 0) fprintf(out,"NONE/n"); return 0; } 

算法和我的基本相同,主要用到了map!

 

此外,官方还有一种比较麻烦的算法,我之前也有这种想法,但是会越界,用链表的话又会超时!

思路是用输入的数字所能产生的字母组合,然后在字典里查找是否存在此字母组合! 

这种比较麻烦的算法还用到了二分查找

你可能感兴趣的:(c,算法,String,File,iterator)