目次
数値ローテイト(難易度:★★☆☆☆)
問題
引数で与えられたint型数値の最上桁の数字(1~9)を最下位桁に移動する関数 int rotate(int n) を実装しなさい。
ただし、0 <= n < 100,000,000 とし、範囲外の場合は -1 を返すものとする。
例えば、1234 が与えられると 2341 を、1020 が与えられると 201 を、7 が与えられると 7 を返す。
#include <iostream> // 標準入出力ライブラリ #include <string> using namespace std; // std 名前空間使用 #define DO_TEST(exp) do_test(exp, __LINE__) void do_test(bool b, int line) { if( b ) return; // OK cout << "\nNG at line " << line << "\n"; exit(1); } int rotate(int n) { // ToDo: ここにnの各桁の数字をローテイトした値を返すコードを記述 return 0; } int main() { DO_TEST( rotate(1234567) == 2345671 ); DO_TEST( rotate(1020) == 201 ); DO_TEST( rotate(9) == 9 ); DO_TEST( rotate(-1234) == -1 ); DO_TEST( rotate(100000000) == -1 ); cout << "\nGood Job!\n"; return 0; }
あみだくじ(難易度:★★★☆☆)
問題
下図のように、左側からスタートし、右側にゴールする「あみだくじ」を考える。
‘-‘, ‘+’, ‘|’, ‘ ‘ 文字で構成される、あみだくじを表す文字列配列と、 何番目の線からスタートするかを引数で与えられ、何番目の線にゴールするかを返す関数 int amida(const vector<string>& lines, int n) を実装しなさい。
ただし、線の番号は 0 オリジン(最初の線が0番)とし、線番号 n は偶数のみが与えられるものとする。
例えば、上図の場合は、0 → 2, 2 → 4, 4 → 0 となる。
また、下図のように偶数ラインに ‘|’ があり、その上下に ‘|’ がある場合は、上下がつながっているとみなし、 上下・左右方向のそれぞれの線はつながっていない(立体交差している)ものとする。 なので、下図の場合は、0 → 4, 2 → 2, 4 → 0 となる。
なお、あみだくじ文字列は常に正常なものが与えられるものとし、それが不正な場合の処理は特に行わなくてよいものとする。
ただし、n が不正な場合は -1 を返すものとする。
#include <iostream> // 標準入出力ライブラリ #include <vector> #include <string> using namespace std; // std 名前空間使用 #define DO_TEST(exp) do_test(exp, __LINE__) void do_test(bool b, int line) { if( b ) return; // OK cout << "\nNG at line " << line << "\n"; exit(1); } int amida(const vector<string>& lines, int n) { // ToDo: ここにコードを記述し、あみだくじの結果を返すように return 0; } int main() { vector<string> a1 = { "-+----+---", " | | ", "-+--+-+-+-", " | | ", "----+---+-"}; DO_TEST( amida(a1, -1) == -1 ); DO_TEST( amida(a1, 0) == 2 ); DO_TEST( amida(a1, 1) == -1 ); DO_TEST( amida(a1, 2) == 4 ); DO_TEST( amida(a1, 3) == -1 ); DO_TEST( amida(a1, 4) == 0 ); DO_TEST( amida(a1, 5) == -1 ); vector<string> a2 = { "----+-----", " | ", "----|-----", " | ", "----+-----"}; DO_TEST( amida(a2, 0) == 4 ); DO_TEST( amida(a2, 2) == 2 ); DO_TEST( amida(a2, 4) == 0 ); vector<string> a3 = { "-----+-----", " | ", "--+--|--+--", " | | | ", "--+--|--|--", " | | ", "-----+--+--"}; DO_TEST( amida(a3, 0) == 2 ); DO_TEST( amida(a3, 2) == 4 ); DO_TEST( amida(a3, 4) == 6 ); DO_TEST( amida(a3, 6) == 0 ); cout << "\nGood Job!\n"; return 0; }
競技プログラミング風 標準C++ライブラリ入門 連載目次リンク
![]() |
筆者:津田伸秀 プロフィール:テニス・オセロ・ボードゲーム・パズル類が趣味の年齢不詳のおじさん。 自宅研究員(主席)。vi と C++が好き。迷走中・・・ ボードゲーム・パズル系アプリ開発・リリースしてます。 |