码迷,mamicode.com
首页 > 其他好文 > 详细

USACO Section1.2 Name That Number 解题报告

时间:2015-03-09 00:27:12      阅读:284      评论:0      收藏:0      [点我收藏+]

标签:

    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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!