競技プログラミング風 C++問題集【第6回】
目次
数値ローテイト(難易度:★★☆☆☆)
引数で与えられたint型数値の最上桁の数字(1~9)を最下位桁に移動する関数 int rotate(int n) を実装しなさい。
ただし、0 <= n < 100,000,000 とし、範囲外の場合は -1 を返すものとする。
例えば、1234 が与えられると 2341 を、1020 が与えられると 201 を、7 が与えられると 7 を返す。
[java]
#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;
}
[/java]
あみだくじ(難易度:★★★☆☆)
下図のように、左側からスタートし、右側にゴールする「あみだくじ」を考える。
‘-‘, ‘+’, ‘|’, ‘ ‘ 文字で構成される、あみだくじを表す文字列配列と、 何番目の線からスタートするかを引数で与えられ、何番目の線にゴールするかを返す関数 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 を返すものとする。
[java]
#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;
}
[/java]
競技プログラミング風 標準C++ライブラリ入門 連載目次リンク
筆者:津田伸秀 プロフィール:テニス・オセロ・ボードゲーム・パズル類が趣味の年齢不詳のおじさん。 自宅研究員(主席)。vi と C++が好き。迷走中・・・ ボードゲーム・パズル系アプリ開発・リリースしてます。 |