【挑戦9】線対称と点対称 (paizaランク B 相当) 解答例 – PHP編【戦セット】

Pocket

【戦セット】 > 【挑戦9】線対称と点対称 (paizaランク B 相当)
※リンク先へ移動する為には「paiza」へのログインが必要です。

warset9

解答例

初めて挑んだ時、結構悩んだ記憶がある問題です。さすがはpaizaランクBの問題ですね(`・ω・´)

 

攻略方針

この問題は与えられた図形が「線対称である」のか、「点対称である」のか、「線対称であり、点対称である」のか、「どちらでもない」のかの、4つの選択肢から1つの解答を導く問題と言えます。線対称と点対称の定義は次のように与えられています。

定義・線対称:ドット絵の中心を通る垂直、または水平な直線で折りたたんだとき、折り目の両端がぴったり重なること
(斜めの直線を折り目にすることは考えません。)
・点対称:ドット絵の中心で180度回転させたとき、もとの図形とまったく同じ形になること

まあ想像した通りの定義ではありますね(;^ω^) この定義に沿って、図形が線対称か点対称であるかを判定しなくてはなりません。多次元配列でマップの各座標を格納し、線対称、または点対称に対応する二つの座標を、二重ループを用いて総当たりで調べていきます。線対称に関しては、平行の場合と垂直の場合、2パターン調べなければならない点は注意してください。

・線対称の比較

warset9a

 

・点対称の比較
warset9b

線対称と点対称のフラグを用意し、図の用に総当たり比較していきます。線対称(垂直の場合と平行の場合)を調べている中で「違う要素が1つ以上あった場合はfalse」、「0ならば線対称なのでtrue」とします。点対称の場合も同様に調べていきます。それでは早速コード別にみていきます。

 

縦列「$n」、横列「$m」、各カウンターとフラグの用意、マップ取得

それぞれ必要な情報を取得しています。マップの取得には「str_split()」を使用しました。

 

線対称の判定

線対称に関するコードです。線対称に関しては平行のものと垂直のものを調べ、どちらかが線対称ならばフラグを「true」とします。

 

点対称の判定

点対称に関するコードです。

 

判定結果を出力する

結果の出力になります。各フラグの結果をもとに条件分岐を作成しています。

 

終わりに

プログラム初心者である私にとって、苦労した問題だったと思いますが、難しい関数を使用するわけでもなく考え方次第で解けるとてもいい問題だと感じます。paizaの問題集は楽しくプログラミングの練習ができるのがいいです(*’ω’*)
さて、長くなりましたが今日はここまでです。お疲れ様でした(・ω・)ノシ

エッグ

シェアする

コメントを残す

メールアドレスが公開されることはありません。

コメントする