【戦セット】> 【挑戦9】線対称と点対称 (paizaランク B 相当) [難易度: 1969 ±18]
※リンク先へ移動するためには[paiza]へのログインが必要です。
この問題は、弊社営業社員が競技プログラミングに挑戦したものです。
https://youtu.be/Vf2RFjXCmZY
ある図形に対し、線対称、点対称は次のように定義されます。
・線対称:ある直線を折り目にして折りたたんだとき、折り目の両側がぴったり重なること
・点対称:ある一点で180度回転させたとき、もとの図形とまったく同じ形になること
この問題では、ドット絵に対する線対称、点対称を以下のように定義します。
・線対称:ドット絵の中心を通る垂直、または水平な直線で折りたたんだとき、折り目の両端がぴったり重なること
(斜めの直線を折り目にすることは考えません。)
・点対称:ドット絵の中心で180度回転させたとき、もとの図形とまったく同じ形になること
n×mのドット絵が入力されるので、そのドット絵が線対称であるか、点対称であるか、その両方か、そのどちらかでもないかを判定するプログラムを作成してください。
入力値(例)
2 3
###
...
出力値(例)
line symmetry
解答例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
<?php list($n, $m) = explode(" ", trim(fgets(STDIN))); for($i=0; $i<$n; $i++){ $d[$i] = trim(fgets(STDIN)); } $line_vertical = true; $line_horizontal = true; $point_s = true; // 点対称 for($i=0; $i<=$n/2; $i++){ for($j=0; $j<=$m/2; $j++){ if($d[$i][$j] != $d[$n-1-$i][$m-1-$j]){ $point_s = false; } } } // 垂直に折りたたむ際 for($i=0; $i<$n; $i++){ for($j=0; $j<=$m/2; $j++){ if($d[$i][$j] != $d[$i][$m-1-$j]){ $line_vertical = false; } } } // 水平に折りたたむ際 for($i=0; $i<=$n/2; $i++){ for($j=0; $j<$m; $j++){ if($d[$i][$j] != $d[$n-1-$i][$j]){ $line_horizontal = false; } } } if($point_s){ if($line_horizontal || $line_vertical){ echo "line point symmetry"; }else{ echo "point symmetry"; } }else{ if($line_horizontal || $line_vertical){ echo "line symmetry"; }else{ echo "none"; } } ?> |