C++_USACO_Name That Number
2013-07-28 19:59
288 查看
这道题,我本打算逐位将数字转化成一个三个字符的字符串,对于第一个数字,进行二分查找,查找到相应三个字符的起始位置。在这3段中,查找第二个数字对应的三个字符的位置,就有9段。再查找到第三个数字对应的三个字符的位置,就有27段了。现在对这27段中的每个字符串,先比较其长度是否符合,再逐位比较剩余字符(除前面3个字符)是否符合。。大致思路就是先用二分查找缩小范围,再进行比较。。感觉不好!
这段是别人的代码。主要思路是:读出dict.txt中的所有字符串,转化成数字串表示,再将每一个数字串与输入的数字串进行比较,就把多对多的比较,转化成了多对一的比较。思路、实现,都最简单的方式。
代码的实现其实很好,读入的字典中的字符-65就得到了相对于'A'字符的距离,而这个距离刚好就是定义的alpha的下标,根据下标找到每个字符对应的代表数字。
下面是综合了一下。我先查找首字母之后分成三段,锁定三段使用上述方法。
这段是别人的代码。主要思路是:读出dict.txt中的所有字符串,转化成数字串表示,再将每一个数字串与输入的数字串进行比较,就把多对多的比较,转化成了多对一的比较。思路、实现,都最简单的方式。
代码的实现其实很好,读入的字典中的字符-65就得到了相对于'A'字符的距离,而这个距离刚好就是定义的alpha的下标,根据下标找到每个字符对应的代表数字。
#include<iostream> #include<fstream> #include<string> using namespace std; const char alpha[26]={'2','2','2','3','3','3','4','4','4','5','5','5', '6','6','6','7','0','7','7','8','8','8','9','9','9','0'}; string data,tmp,words; bool flag=false; int main(){ ifstream fin("namenum.in"); ofstream fout("namenum.out"); fin>>data; ifstream tin("dict.txt"); while (tin>>words){ int l=words.size(); tmp=""; for (int i=0;i<l;i++) tmp+=alpha[words[i]-65]; if (tmp==data) {fout<<words<<endl;flag=true;} } if (!flag) fout<<"NONE"<<endl; return 0; }
下面是综合了一下。我先查找首字母之后分成三段,锁定三段使用上述方法。
/* PROB:namenum LANG:C++ */ #include<iostream> #include<fstream> #include<string> using namespace std; int Searchfirst(int low,int high,char *dict[],string three_str,int k){ int middle=(low+high)/2; while(low<=high){ middle=(low+high)/2; if(dict[middle][0]<three_str[k]) low=middle+1; else if(dict[middle][0]>=three_str[k]) high=middle-1; } return low; } int Searchlast(int low,int high,char *dict[],string three_str,int k){ int middle=(low+high)/2; while(low<=high){ middle=(low+high)/2; if(dict[middle][0]<=three_str[k]) low=middle+1; else if(dict[middle][0]>three_str[k]) high=middle-1; } return high; } int main(){ ifstream fin("namenum.in"); ofstream fout("namenum.out"); string str; string three_str; int len_dict; fin>>str; fin.out; int pose[3][2]={(0,0),(0,0),(0,0)}; int low; int high; ifstream ifs("dict.txt"); char *dict[5000]; int i=0; while(i<5000){ dict[i]=(char *)malloc(60); ifs>>dict[i]; if((dict[i][0])) i++; else break; } ifs.out; const char alpha[26]={'2','2','2','3','3','3','4','4','4','5','5','5', '6','6','6','7','0','7','7','8','8','8','9','9','9','0'}; len_dict=i; switch(str[0]-48){ case 2: three_str="ABC";break; case 3: three_str="DEF";break; case 4: three_str="GHI";break; case 5: three_str="JKL";break; case 6: three_str="MNO";break; case 7: three_str="PRS";break; case 8: three_str="TUV";break; case 9: three_str="WXY";break; } for(int k=0;k<3;k++){ low=0; high=len_dict-1; pose[k][0]=Searchfirst(low,high,dict,three_str,k); } pose[0][1]=pose[1][0]-1; pose[1][1]=pose[2][0]-1; low=0; high=len_dict-1; pose[2][1]=Searchlast(low,high,dict,three_str,2); string temp=""; int t=0; bool exist=false; for(int k=0;k<3;k++){ int start=pose[k][0]; int end=pose[k][1]; for(int j=start;j<=end;j++){ temp=""; while(dict[j][t]!='\0') temp+=alpha[dict[j][t++]-65]; if(temp==str){ exist=true; for(int s=0;s<t;s++) fout<<dict[j][s]; fout<<endl; } t=0; } } if(!exist) fout<<"NONE"<<endl; return 0; }
相关文章推荐
- USACO Name That Number
- USACO-Section1. 4000 3 Name That Number (遍历与字符串比较)
- USACO Name That Number
- USACO NameThatNumber
- USACO天梯--Name That Number
- USACO--1.2Name That Number
- USACO1.2.3--Name That Number
- USACO Section 1.2 Name That Number
- USACO Section 1.2 Name That Number
- usaco 1.2 Name That Number(数字字母转化)
- 【USACO-Chapter1-1.2】【模拟】Name That Number
- USACO Section 1.2 : Name That Number
- Usaco 1.2.3 命名那个数字(Name That Number)
- usaco 1.2.3 name that number
- USACO 1.2 Name That Number (AD-hoc)
- USACO 1.2.3 Name That Number
- 【多文件操作】【检索】Name That Number (Usaco_Training 1.2)
- USACO 1.2 Name That Number
- USACO section1.2 Name That Number
- USACO-section1.2.3 Name that number