Keitai Message
2006.07.05 23:44 ACM/ICPC
[問題] ACM/ICPC Simulated Japan Domestic 2005: Problem A
[解説]
日常で使う携帯電話の機能を実装する問題なので、面白みがあり、プログラミング入門の問題として良いですね
。簡単な問題ですが、ポイントは各ボタンに文字列(例えば、ボタン 2 の場合 "abc")を割り当て、押された回数を対応する文字列の長さで割った余りによって、現在の文字のインデックスを特定します。例えば
22222222 は
a → b → c → a → b → c → a → b
となり、最終的に b を指しますが、これは
押された回数 % 文字列の長さ = 8 % 3 = 2
より、"abc" の 2 番目の文字と示すことができます。
(インデックスが 0 から始まるので、プログラム例では -1 していることに注意して下さい)
従って、連続する文字(数字)の数をカウントしながら、0 が入力されたときに上記の計算をして対応する文字を出力するプログラムを書けばよいわけです。
[プログラム例]
[解説]
日常で使う携帯電話の機能を実装する問題なので、面白みがあり、プログラミング入門の問題として良いですね

22222222 は
a → b → c → a → b → c → a → b
となり、最終的に b を指しますが、これは
押された回数 % 文字列の長さ = 8 % 3 = 2
より、"abc" の 2 番目の文字と示すことができます。
(インデックスが 0 から始まるので、プログラム例では -1 していることに注意して下さい)
従って、連続する文字(数字)の数をカウントしながら、0 が入力されたときに上記の計算をして対応する文字を出力するプログラムを書けばよいわけです。
[プログラム例]
// @author yutaka C++ #include<iostream> #include<string> using namespace std; static const string T[10] = {"", ".,!? ", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; void compute(){ string line; cin >> line; int count = 1; char pre = line[0]; for ( int i = 1; i < line.size(); pre = line[i++] ){ if ( line[i] == '0' && pre != '0' ){ cout << T[pre-'0'][(count-1)%T[pre-'0'].size()]; count = 0; } else if ( line[i] == pre ) count++; else count = 1; } cout << endl; } main(){ string line; int tcase; cin >> tcase; for ( int i = 0; i < tcase; i++ ) compute(); }
スポンサーサイト
| コメント(0) | トラックバック(0) | ↑ページトップ |