AIZU ONLINE JUDGE

AOJ ITP1 5_B(Print a Frame)を解く

AOJ_ITP1_5_B

Aizu Online Judge(AOJ)が提供している「プログラミング入門」(ITP1)の5_B問題をC++とPython で解いてみました。

ITP1 のトピック5では、構造化プログラムについて学びます。「制御構造や文を組み合わせる構造化プログラミングの基礎を身に付けます。」とあります。この学習コースを通じて、Python に慣れていきたいと考えています。

問題(5_B: Print a Frame)

問題はリンク先をご覧ください。

AOJ ITP1 5_B問題:Print a Frame

5_Aの応用となります。縦と横を繰り返し読みながら、繰り返しが必要な出力を行います。

解答案

C++ プログラム例(ITP1 5_B)

5_Aをベースとして、枠と枠以外の出力を分けています。

#include <iostream>

using namespace std;

int main()
{
	int h, w;

	while (1) {
		cin >> h >> w;

		if ((h == 0)&&(w == 0)) {
			break;
		}

		for (int i = 0; i < h; ++i) {
			for (int j = 0; j < w; ++j) {
				if ((i ==0)||(i == h - 1)||(j == 0)||(j == w - 1)) {
					cout << "#";
				} else {
					cout << ".";
				}
			}
			cout << endl;
		}
		cout << endl;
	}

	return 0;
}

Python プログラム例(ITP1 5_B)

Python では、上端と下端の行は、リストを繰り返しを使わずに定義します(6行目)。途中行のリストは、同じように定義して、行頭と行末の文字を入れ替えています(7~9行目)。

while True:
    h, w = map(int, input().split())
    if h == 0 and w == 0:
        break

    line1 = ["#"] * w
    line2 = ["."] * w
    line2[0] = "#"
    line2[-1] = "#"

    print(*line1, sep="")
    for i in range(h - 2):
        print(*line2, sep="")
    print(*line1, sep="")
    print("")

上記プログラムは、すべて AOJ で「AC(Accepted=正解)」と判定されます。

最後に

トピック5では、トピック4までに学んだことを組み合わせて使います。5-Aから5-Cまでは同じ題材を扱っています。

引き続き、ITP1 の問題を紹介していきます。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA