您的位置:首页 > 编程语言 > C语言/C++

C++_USACO_Name That Number

2013-07-28 19:59 288 查看
这道题,我本打算逐位将数字转化成一个三个字符的字符串,对于第一个数字,进行二分查找,查找到相应三个字符的起始位置。在这3段中,查找第二个数字对应的三个字符的位置,就有9段。再查找到第三个数字对应的三个字符的位置,就有27段了。现在对这27段中的每个字符串,先比较其长度是否符合,再逐位比较剩余字符(除前面3个字符)是否符合。。大致思路就是先用二分查找缩小范围,再进行比较。。感觉不好!

这段是别人的代码。主要思路是:读出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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: