へんてこのブログ

日々気づいたことや、最近やっていることを書いています

AOJ Volume20-2006

ICPCの過去問
Keitai Message
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2006

考え方:
2次元配列に所定のデータを格納しておき、hoge[{押された番号}][{押した回数} % {押された番号の要素数} - 1]でアクセスして、それを結果に格納する。
{押した回数} % {押された番号の要素数} = 0のときのみ、hoge[{押された番号}][押された番号の要素数} - 1]でアクセスして結果に格納する。

#include<iostream>
#include<string>
#include<vector>

using namespace std;


int main() {
    
    vector<string> hoge;
    
    hoge.push_back(".,!? ");
    hoge.push_back("abc");
    hoge.push_back("def");
    hoge.push_back("ghi");
    hoge.push_back("jkl");
    hoge.push_back("mno");
    hoge.push_back("pqrs");
    hoge.push_back("tuv");
    hoge.push_back("wxyz");
    
    int T = 0;
    cin >> T;
    for (int k = 0; k < T; k++) {
        string s;
        cin >> s;
        
        string resurt = "";
        
        
        int c_count = 0;
        char h;
        int last_iti = 0;
        for (int i=0; i < s.size(); i++) {
            if(c_count != 0) {
                if (h != s[i]) {
                    if (s[i] == '0') {
                        int iti = h - 48 - 1;
                        int iti_hoge = c_count % hoge[iti].size();
                        if (iti_hoge == 0) {
                            resurt += hoge[iti][hoge[iti].size() - 1];
                        }else {
                            resurt += hoge[iti][iti_hoge - 1];
                        }
                    }
                    c_count = 0;
                }else {
                    c_count++;
                }
            }else {
                if (s[i] == '0') {
                    continue;
                }
                h = s[i];
                c_count++;
            }
        }
        
        //結果表示
        cout << resurt << endl;
        
    }
    
    
    
}