Quantcast
Channel: 配列タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 822

Perl で解くAtCoder2次元配列問題

$
0
0

はじめに

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次元配列問題の手法を確立した

参照したサイト
今回はいいサイト、見つかりませんでした


Viewing all articles
Browse latest Browse all 822

Latest Images

Trending Articles