競技プログラミング風 C++問題集【第6回】


目次

数値ローテイト(難易度:★★☆☆☆)

問題

引数で与えられた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;
}
ヒント
解答例
解説

あみだくじ(難易度:★★★☆☆)

問題

下図のように、左側からスタートし、右側にゴールする「あみだくじ」を考える。

競技プログラミング風C++問題集【第6回】_01

‘-‘, ‘+’, ‘|’, ‘ ‘ 文字で構成される、あみだくじを表す文字列配列と、 何番目の線からスタートするかを引数で与えられ、何番目の線にゴールするかを返す関数 int amida(const vector<string>& lines, int n) を実装しなさい。
ただし、線の番号は 0 オリジン(最初の線が0番)とし、線番号 n は偶数のみが与えられるものとする。

例えば、上図の場合は、0 → 2, 2 → 4, 4 → 0 となる。

また、下図のように偶数ラインに ‘|’ があり、その上下に ‘|’ がある場合は、上下がつながっているとみなし、 上下・左右方向のそれぞれの線はつながっていない(立体交差している)ものとする。 なので、下図の場合は、0 → 4, 2 → 2, 4 → 0 となる。

競技プログラミング風C++問題集【第6回】_02

なお、あみだくじ文字列は常に正常なものが与えられるものとし、それが不正な場合の処理は特に行わなくてよいものとする。
ただし、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++問題集【第16回】

目次 0/1ナップサック問題(難易度:★★★★☆) 0/1ナップサック問題(難易度:★★★★☆) 関連記事 筆者:津田伸秀 プロフィール:テニス・オセロ・ボードゲーム・パズル類が趣味の年齢不詳のおじさん。 自宅研究員(主 […]
コメントなし

競技プログラミング風 C++問題集【第15回】

目次 ポーカー:役判定(難易度:★★★☆☆) ポーカー:役判定(難易度:★★★☆☆) 関連記事 筆者:津田伸秀 プロフィール:テニス・オセロ・ボードゲーム・パズル類が趣味の年齢不詳のおじさん。 自宅研究員(主席)。vi […]
コメントなし

競技プログラミング風 C++問題集【第14回】

目次 無向グラフ(難易度:★★★☆☆) 無向グラフ(難易度:★★★☆☆) 関連記事 筆者:津田伸秀 プロフィール:テニス・オセロ・ボードゲーム・パズル類が趣味の年齢不詳のおじさん。 自宅研究員(主席)。vi と C++が […]
コメントなし

競技プログラミング風 C++問題集【第13回】

はじめに 今回から4回にわたって「競技プログラミング風 C++問題集 第13回~第16回(シーズン4)」をお届けする。 各問題は、「問題文」「テストコード」「ヒント」「解答例」「解説」から構成される。 まず、問題を読んで […]
コメントなし

競技プログラミング風 C++問題集【第12回】

目次 文字列比較(難易度:★★★★☆) 文字列比較(難易度:★★★★☆) 関連記事 筆者:津田伸秀 プロフィール:テニス・オセロ・ボードゲーム・パズル類が趣味の年齢不詳のおじさん。 自宅研究員(主席)。vi と C++が […]
コメントなし

競技プログラミング風 C++問題集【第11回】

目次 クローズド・ナイト・ツアー(難易度:★★★★☆) クローズド・ナイト・ツアー(難易度:★★★★☆) 関連記事 筆者:津田伸秀 プロフィール:テニス・オセロ・ボードゲーム・パズル類が趣味の年齢不詳のおじさん。 自宅研 […]
コメントなし

競技プログラミング風 C++問題集【第10回】

目次 オセロ:石反転(難易度:★★★☆☆) 両端キュー(難易度:★★★☆☆) オセロ:石反転(難易度:★★★☆☆) 両端キュー(難易度:★★★☆☆) 関連記事 筆者:津田伸秀 プロフィール:テニス・オセロ・ボードゲーム・ […]
コメントなし

競技プログラミング風 C++問題集【第9回】

はじめに 今回から4回にわたって「競技プログラミング風 C++問題集 第9回~第12回(シーズン3)」をお届けする。 各問題は、「問題文」「テストコード」「ヒント」「解答例」「解説」から構成される。 まず、問題を読んで正 […]
コメントなし

競技プログラミング風 C++問題集【第8回】

目次 文字列クラス(難易度:★★★★☆) 文字列クラス(難易度:★★★★☆) 関連記事 筆者:津田伸秀 プロフィール:テニス・オセロ・ボードゲーム・パズル類が趣味の年齢不詳のおじさん。 自宅研究員(主席)。vi と C+ […]
コメントなし

競技プログラミング風 C++問題集【第7回】

目次 数独(難易度:★★★☆☆) 数独(難易度:★★★☆☆) 関連記事 筆者:津田伸秀 プロフィール:テニス・オセロ・ボードゲーム・パズル類が趣味の年齢不詳のおじさん。 自宅研究員(主席)。vi と C++が好き。迷走中 […]
コメントなし
筆者:津田伸秀
プロフィール:テニス・オセロ・ボードゲーム・パズル類が趣味の年齢不詳のおじさん。 自宅研究員(主席)。vi と C++が好き。迷走中・・・ ボードゲーム・パズル系アプリ開発・リリースしてます。
  • このエントリーをはてなブックマークに追加

PAGE TOP