PHP 問題:紙の張り合わせ
-新しく学んだこと-
・print_r( )
・for繰り返し
問題:
折り紙を連結して 1 枚の大きな紙の垂れ幕を作ることにしました。
各折り紙は 1 辺の長さが D cm 、すなわち縦 D cm × 横 D cm の正方形です。これらの折り紙を、左右に長く伸びた直線を基準に貼り付けていきます。ただし、各折り紙について、いずれか 1 辺がちょうど直線に重なるようにします。
また、 1 枚目を貼り付けたあと、 2 枚目以降は以下のルールに従って順に貼り付けていきます。
・1 つ前に貼り付けた折り紙の右辺からみて、 1 cm 以上 D/2 cm 以下だけ重なるように貼り付ける。(下図に例を示しています。)
上記のルールを守って作られたある垂れ幕について、基準の直線を平面座標の x 軸とみなして、2 枚目以降の各折り紙における 1 つ前の折り紙への重なり具合が与えられます。
1 枚になった垂れ幕部分の面積を計算してください。
例えば、入力例 1 では以下のように計算できます。
入力例1
3 4 枚数 1辺の長さ
2 重なる長さ1
1 重なる長さ2
出力 36
プログラミングの前にフローチャートを作ります。
プログラムに直すと
3行目:垂れ幕の面積用の箱$mensekiを用意します。
4行目:重なっていない長さ用の箱$kasaneを用意します。
5行目:垂れ幕横の長さ用の箱$yokoを用意します。
6行目:入力が終わるまで{ }内の処理を繰り返します。
7行目:入力を配列$stdin_arrayに入れます。
$stdin_array[0]=3 4
$stdin_array[1]=2
$stdin_array[2]=1
となります。
9行目:配列$kamiを用意します。今回は、$stdin_array[0]=3 4を3と4に分けるために用意しました。
10行目:中身が無くなるまで繰り返し、$valueの箱に$stdin_arrayの数字を入れます。
11行目:$valueの中身に空白があれば区切り、$kamiの箱へ入れます。
$kami[0]=3
$kami[1]=4
$kami[2]=2
$kami[3]=1
となります。
13行目:$yokoの箱に$kami[1]の数字を入れます。
14行目:$countの箱に2を入れ、$countの数字が$kami[1]の数字以下である間は{ }の処理を繰り返します。繰り返す毎に$countの数字に1加算します。
15行目:重なっていない長さ=1辺の長さ-重なる長さ
16行目:垂れ幕横の長さ=垂れ幕横の長さ+重なっていない長さ
18行目:垂れ幕の面積=一辺の長さ×横の長さ
19行目:垂れ幕の面積を出力する。
・print_r(表示したい式や値)
情報をわかりやすく表示したい時に使います。
筆者は、11行目で配列の内容が上手くいっているかを確認するために
12行目にprint_r($kami);を追記しました。確認後は消しています。
・for(初期化式;条件式;変化式){ }
初期化式は、for分の処理が開始される時に1度だけ実行されます。条件に使う変数などを初期化する式が入ります。
条件式は、繰り返すかどうかの判断する式が入ります。
変化式は、繰り返しが1回行われる毎に、変数などを変化させたい時に使います。