标签:
namenum解题报告 —— icedream61 博客园(转载请注明出处)
------------------------------------------------------------------------------------------------------------------------------------------------
【题目】
你有一个手机,键盘如下所示:
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"。里面有许多英文字符串,一行一个,是按照字典序排好的。
现在给你一个输入,是数字字符串。请你从字典中找到所有能与之匹配的英文字符串,一行一个,按照字典序输出,一个没有输出"NONE"。
所谓匹配是指:按照手机键盘,你可以将两个串对应起来,并且长度相同。
【数据范围】
数字串长度可能是1~12
英文串不到5000个
【输入样例】
4734
【输出样例】
GREG
------------------------------------------------------------------------------------------------------------------------------------------------
【分析】
没有难度。
------------------------------------------------------------------------------------------------------------------------------------------------
【总结】
1.字典本身是按照字典序排好的,注意到这个,就不用对答案再排序了……(我就没看到,又写了个快排)
2.题目没说字符串有多长,于是我用的string去规避这个问题,其实搞个比较大的char数组也是可以的。
3.这题比较奇葩……有个dict.txt,在网页上给出链接了,但其内容很大。我不知道他想要我当做输入文件去读,还是直接存到代码里。
当我用ifstream去读时,发现读不到,不知是不是我读错了。于是我把它写到了代码的初始化部分,代码瞬间变成了100K,USACO服务器真好……
------------------------------------------------------------------------------------------------------------------------------------------------
【代码】
1、namenum.cpp
1 /* 2 ID: icedrea1 3 PROB: namenum 4 LANG: C++ 5 */ 6 7 #include <iostream> 8 #include <fstream> 9 using namespace std; 10 11 void qsort(string str[],int l,int r) 12 { 13 if(l>=r) return; 14 int i=l,j=r; 15 string x=str[(l+r)>>1]; 16 while(true) 17 { 18 while(str[i]<x) ++i; 19 while(str[j]>x) --j; 20 if(i>j) break; 21 swap(str[i],str[j]); 22 ++i; --j; 23 } 24 qsort(str,l,j); qsort(str,i,r); 25 } 26 27 bool same(string name,string num) 28 { 29 if(name.size()!=num.size()) return false; 30 for(int i=0;i!=num.size();++i) 31 { 32 switch(num[i]) 33 { 34 case ‘2‘: 35 if(name[i]!=‘A‘ && name[i]!=‘B‘ && name[i]!=‘C‘) return false; 36 break; 37 case ‘3‘: 38 if(name[i]!=‘D‘ && name[i]!=‘E‘ && name[i]!=‘F‘) return false; 39 break; 40 case ‘4‘: 41 if(name[i]!=‘G‘ && name[i]!=‘H‘ && name[i]!=‘I‘) return false; 42 break; 43 case ‘5‘: 44 if(name[i]!=‘J‘ && name[i]!=‘K‘ && name[i]!=‘L‘) return false; 45 break; 46 case ‘6‘: 47 if(name[i]!=‘M‘ && name[i]!=‘N‘ && name[i]!=‘O‘) return false; 48 break; 49 case ‘7‘: 50 if(name[i]!=‘P‘ && name[i]!=‘R‘ && name[i]!=‘S‘) return false; 51 break; 52 case ‘8‘: 53 if(name[i]!=‘T‘ && name[i]!=‘U‘ && name[i]!=‘V‘) return false; 54 break; 55 case ‘9‘: 56 if(name[i]!=‘W‘ && name[i]!=‘X‘ && name[i]!=‘Y‘) return false; 57 break; 58 } 59 } 60 return true; 61 } 62 63 void init(string dict[]); 64 65 int main() 66 { 67 ifstream in("namenum.in"); 68 ofstream out("namenum.out"); 69 70 int n,s=4617; 71 string num,r[5000],dict[5000]; 72 73 getline(in,num); init(dict); 74 for(int i=0;i!=s;++i) 75 { 76 if(same(dict[i],num)) r[++n]=dict[i]; 77 } 78 79 if(!n) out<<"NONE"<<endl; 80 else 81 { 82 qsort(r,1,n); 83 for(int i=1;i<=n;++i) out<<r[i]<<endl; 84 } 85 86 in.close(); 87 out.close(); 88 return 0; 89 } 90 91 void init(string dict[]) 92 { 93 // 用下面的代码生成 94 }
2、生成字典的代码
1 #include <iostream> 2 #include <fstream> 3 using namespace std; 4 5 int main() 6 { 7 ifstream in("dict.txt"); 8 ofstream out("doc.txt"); 9 10 string name; 11 for(int i=0;getline(in,name);++i) 12 out<<"\tdict["<<i<<"]=\""<<name<<"\";"<<endl; 13 14 in.close(); 15 out.close(); 16 return 0; 17 }
USACO Section1.2 Name That Number 解题报告
标签:
原文地址:http://www.cnblogs.com/icedream61/p/4321420.html