C++_USACO_Name That Number

这道题,我本打算逐位将数字转化成一个三个字符的字符串,对于第一个数字,进行二分查找,查找到相应三个字符的起始位置。在这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;
}

 

 

posted @ 2013-07-28 19:59  开心成长  阅读(319)  评论(0编辑  收藏  举报