はじめに
AtCoder:競技プログラミングコンテストを開催する国内最大のサイトで、時々次のような問題が出題されます。
#...#.#
..#...#
.#..#..
DISCO presents ディスカバリーチャンネル コードコンテスト2020 予選 C - Strawberry Cakes
41 7 46
26 89 2
78 92 8
AtCoder Beginner Contest 157 B - Bingo
いずれも、2次元配列を使用して解答いたします。
Perl の配列
Perlの配列は、java の様に簡単に2次元配列が作成できないところがもどかしいです。
array.java
inta[][]=newint[h][w];
リファレンスの使用例も、動的に作成する方法が示されていないように感じます。
静的なarray.pl
my$a=[[41,7,46],[26,89,2],[78,92,8]];print$a->[0][1];# => 7$a->[0][1]=6;print$a->[0][1];# => 6
TLEになった手法
TLE.pl
$s[$i*$w+$j]=0;
C - Strawberry Cakesの時は、配列を1次元配列とし、i行j列にアクセスする際、幅wを掛けてi*w+j番目の要素に取得する方法を取りましたが、TLEになりました。
実行時間 |
---|
2105 ms |
ACした手法
ベストな方法かわかりませんが、ACしました。
B-Bingo.pl
usestrict;usewarnings;my@a;{for(my$i=0;$i<3;$i++){my$in=<STDIN>;my@b=split("",$in);$a[$i]=\@b;}}my$n=<STDIN>;chomp$n;my@b;{for(my$i=0;$i<$n;$i++){my$in=<STDIN>;chomp$in;$b[$i]=$in;}}for(my$i=0;$i<3;$i++){for(my$j=0;$j<3;$j++){for(my$k=0;$k<$n;$k++){if($a[$i][$j]==$b[$k]){$a[$i][$j]=0;}}}}my$ans="No";for(my$i=0;$i<3;$i++){if($a[$i][0]+$a[$i][1]+$a[$i][2]==0){$ans="Yes";last;}if($a[0][$i]+$a[1][$i]+$a[2][$i]==0){$ans="Yes";last;}}if($a[0][0]+$a[1][1]+$a[2][2]==0){$ans="Yes";}if($a[0][2]+$a[1][1]+$a[2][0]==0){$ans="Yes";}print"$ans\n";
配列をリファレンスで受け取ることにより、それ以降は簡単にアクセスできます。
dynamic.pl
$a[$i]=\@b;$a[$i][$j]=0;
B - Bingoの実行時間は 4ms
C - Strawberry Cakesの実行時間も余裕のある時間となっています。
実行時間 |
---|
155 ms |
まとめ
- Perlでの2次元配列問題の手法を確立した
参照したサイト
今回はいいサイト、見つかりませんでした