1. 程式人生 > >P3864 [USACO1.2]命名那個數字 Name That Number

P3864 [USACO1.2]命名那個數字 Name That Number

ret sdc 連續 cin 字典序 輸入 代碼 num 有效

題目描述

在威斯康辛州牛守誌大農場經營者之中,都習慣於請會計部門用連續數字給母牛打上烙印。但是,母牛本身並沒感到這個系統的便利,它們更喜歡用它們喜歡的名字來呼叫它們的同伴,而不是用像這個的語句"C‘mon, #4364, get along."。請寫一個程序來幫助可憐的牧牛工將一只母牛的烙印編號翻譯成一個可能的名字。因為母牛們現在都有手機了,使用標準的按鍵的排布來把將數目翻譯為文字:( 除了 "Q" 和 "Z")

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" 的文件中,它包含一連串的少於 5,000個(準確地說是4617個)可被接受的牛的名字。 (所有的名字都是大寫的且已按字典序排列) 請讀入母牛的編號並返回那些能從編號翻譯出來並且在字典中的名字。舉例來說,編號 4734 能產生的下列各項名字: GPDG GPDH GPDI GPEG GPEH GPEI GPFG GPFH GPFI GRDG GRDH GRDI GREG GREH GREI GRFG GRFH GRFI GSDG GSDH GSDI GSEG GSEH GSEI GSFG GSFH GSFI HPDG HPDH HPDI HPEG HPEH HPEI HPFG HPFH HPFI HRDG HRDH HRDI HREG HREH HREI HRFG HRFH HRFI HSDG HSDH HSDI HSEG HSEH HSEI HSFG HSFH HSFI IPDG IPDH IPDI IPEG IPEH IPEI IPFG IPFH IPFI IRDG IRDH IRDI IREG IREH IREI IRFG IRFH IRFI ISDG ISDH ISDI ISEG ISEH ISEI ISFG ISFH ISFI 碰巧,81個中只有一個"GREG"是有效的(在字典中)。

寫一個程序來對給出的編號打印出所有的有效名字,如果沒有則輸出NONE。編號可能有12位數字。

輸入輸出格式

輸入格式:

第一行一行包含一個編號(長度可能從1到12)。

接下來4617行,每行一個字符串表示可以被接受的名字

輸出格式:

(file namenum.out)

以字典順序輸出一個有效名字的不重復列表,一行一個名字。 如果沒有有效名字,輸出‘NONE‘。 //註釋:似乎數字只有8^4種排列(1與0不能用)

輸入輸出樣例

輸入樣例#1: 復制
4734
NMSL
GREG
LSDC
....(太多了不寫了)

感覺這個題目還是不錯的,大體思路:dfs。剩余解釋放入代碼裏。
技術分享圖片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long
 4 char c[11][4]={{0,0,0,0},{0,0,0,0},{0,A,B,C},{0,D,E,F},{0,G,H,I},{0,J,K,L},{0,M,N,O},{0,P,R,S},{0,T,U,V},{0,W,X,V}};
 5 //將按鍵代表的字母放入二維數組,方便枚舉
 6 char temp[13];char s[13];int k;
 7 //temp保存臨時字母,s為構成字符串
 8 set<string> st;
 9 void dfs(int idx)
10 {
11     if(idx==k+1) {
12         string sss(temp+1,temp+k+1);
13         st.insert(sss);
14         return ;
15 
16     }
17     for(int i=1;i<=3;++i)
18     {
19         temp[idx]=c[s[idx]-0][i];
20         dfs(idx+1);
21 
22     }
23 }
24 int main()
25 {
26 
27     cin>>(s+1);
28 
29     k=strlen(s+1);//長度
30 
31     dfs(1);
32    // int num=0;
33     /*for(set<string>::iterator p=st.begin();p!=st.end();++p)
34     {
35         cout<<*p<<" ";
36         num++;
37 
38     }
39     cout<<endl<<num;
40     */
41     string ok;bool r=false;
42     for(int i=1;i<=4617;++i)
43     {
44         cin>>ok;
45         if(st.count(ok)) {r=1;cout<<ok<<endl;}
46     }
47    if(r==false) cout<<"NONE"<<endl;
48 
49 
50 
51 }
View Code

P3864 [USACO1.2]命名那個數字 Name That Number