Aizu Online Judge(AOJ)が提供している「プログラミング入門」(ITP1)の5_C問題をC++とPython で解いてみました。
ITP1 のトピック5では、構造化プログラムについて学びます。「制御構造や文を組み合わせる構造化プログラミングの基礎を身に付けます。」とあります。この学習コースを通じて、Python に慣れていきたいと考えています。
問題(5_C: Print a Chessboard)
問題はリンク先をご覧ください。
AOJ ITP1 5_C問題:Print a Chessboard
この問題も5_Aの応用となります。縦と横を繰り返し読みながら、繰り返しが必要な出力を行います。
解答案
C++ プログラム例(ITP1 5_C)
5_Bをベースとして、行と列を加えた数の偶数奇数によって、出力を分けています。
#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 + j)% 2 == 0) {
cout << "#";
} else {
cout << ".";
}
}
cout << endl;
}
cout << endl;
}
return 0;
}
Python プログラム例(ITP1 5_C)
まず、C++ をそのまま移植したプログラムを示します。あまり Python らしくないかもしれません。
while True:
h, w = map(int, input().split())
if h == 0 and w == 0:
break
for i in range(h):
for j in range(w):
if (i + j) % 2 == 0:
print("#", end="")
else:
print(".", end="")
print("")
print("")
行をリストとして定義してから出力するプログラムも示します。偶数行と奇数行を問題の制約に記載がある最大の桁数で生成して、出力時に指定された文字数になるように切り出しています。
line1 = ""
line2 = ""
for i in range(150):
line1 += "#."
line2 += ".#"
while True:
h, w = map(int, input().split())
if h == 0 and w == 0:
break
for i in range(h):
if i % 2 == 0:
print(line1[:w])
else:
print(line2[:w])
print("")
上記プログラムは、すべて AOJ で「AC(Accepted=正解)」と判定されます。
最後に
5-Aから5-Cまでは同じ題材を扱いました。構造が同じになるようにプログラムを書きました。そのため差分に集中してプログラムを書くことができています。
引き続き、ITP1 の問題を紹介していきます。