LoginSignup
1
2

More than 1 year has passed since last update.

【図解解説】JOI2021-2022 一次予選 第3回 問題4 ボールの移動

Last updated at Posted at 2021-11-26

図解解説シリーズ

競技プログラミングを始めたばかりでAtCoderの解説やJOIの解説ではいまいちピンと来ない…という人向けに、図解を用いて解説を行います。

問題文

情報オリンピック日本委員会に掲載されている問題

AtCoderに掲載されている問題

入出力など実際に確認して自分の作成したプログラムを採点することができます。

図解解説

今年度の一次予選のD問題は、以下の5つのスキルを確認する問題になっています。
1.入力・出力を正しく利用できる
2.算術演算子を正しく利用できる
3.条件分岐(if)を正しく利用できる
4.繰り返し処理を正しく利用できる
5.配列(リスト)を正しく利用できる

問題文を整理するために、具体的な数字を用いて、図示して考えてみます。
スライド1.PNG
箱とボールのどちらを基準にして操作を行うか、入力例1を使ってシミュレーションしてみます。

箱を基準に考えてみると、箱の中にボールが1個も入っていない状況や、箱の中にボールがたくさん入っている状況が発生します。特定のボールがどの箱の中に入っていて、次にどの箱に動かせばいいのか…と考えるのも大変です。

一方、ボールを基準に考えてみると、今、ボールがどの箱の中に入っているのか管理するだけで済みます。変更の発生するところだけ変更すれば済みます。
従って、今回は、ボールを基準にして管理する方法でプログラムを行うことにします。
スライド2.PNG
そこで、Ballという配列を用意して、その配列の要素の中に箱の番号を入れて状態を管理します。

配列は、要素番号0から始まります。もし、配列の要素数をボールの数と一致させると、箱とボールの番号も0に読み替えて管理する必要があります。0から管理しなくてもすむように、配列の要素数を「ボールの数+1」にして、箱とボールの番号をそのまま使用すると便利です。

解答例

d.py
N,M = map(int,input().split())
#ボールがどの箱に入っているか管理するための配列Ballを宣言し、初期値(ボールの番号=箱の番号)を代入
Ball = []
for i in range(N+1):
  Ball.append(i)
#ボールXが箱Yに移動する操作をM回実行
for i in range(M):
  X,Y = map(int,input().split())
  Ball[X]=Y
#最終的にどの箱に入っているかボール1からボールNまで順番に出力
for i in range(1,N+1):
  print(Ball[i])

採点サイトに提出したプログラム

イラスト

スライド内で使用しているイラストはすべて「いらすとや」の素材を利用しています。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2