takenoko03の日記

PHP言語で仕事する

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回行われる毎に、変数などを変化させたい時に使います。