いつかAランクをゆめみて・・

Aランクレベルアップをめざしてといたれんしゅ~もんだい「陣取りゲーム」

陣取りゲーム結果 3じかんくらいふんと~しながらやっととけました~!

どうすれば効率よくとけるか・・ターンごとに全マスチェックしていたのでは時間がかかりすぎるよね・・・なるべく手間を減らすには・・・??とかんがえてたらいいほうほうをひらめいちゃいました^-^*

んがっ、それをコードにするのにずいぶんくろ~しちゃった・・w

というわけできき☆彡の解答~^-^*

my %pid = ('A' => 0, 'B' => 1);
my @pname = ('A', 'B');
my @cord = ([-1, 0], [0, 1], [0, -1], [1, 0]);

my $input_line = <STDIN>;
chomp $input_line;
my ($H, $W) = split(/ /,$input_line);
my $N = <STDIN>;
chomp $N;

# フィールドの初期状態
my @field = ();
my @new_territory = ([], []);
my @score = (0, 0);
for(my $a = 0; $a < $H; ++$a){
    $input_line = <STDIN>;
    chomp $input_line;
    push(@field,[split(//, $input_line)]);
    for(my $b = 0; $b < $W; ++$b) {
        if (defined($pid{$field[$a][$b]})) {
            push(@{$new_territory[ $pid{$field[$a][$b]} ]}, [$a, $b]);
            ++$score[$pid{$field[$a][$b]}];
        }
    }
}

my $flg = 1;
my $turn = $pid{$N};
my $pass = 0;
#ゲーム開始!
while($flg) {
    $flg = 0;
    my $painted = [];
    foreach $pick (@{$new_territory[$turn]}) {
        for(my $a = 0; $a < 4; ++$a) {
            my $ny = $$pick[0] + $cord[$a][0];
            my $nx = $$pick[1] + $cord[$a][1];
            if (
                $ny >= 0 && $ny < $H &&
                $nx >= 0 && $nx < $W &&
                $field[$ny][$nx] eq '.'
            ) {
                # 侵略!<s>イカ娘</s>
                $field[$ny][$nx] = $pname[$turn];
                ++$score[$turn];
                push(@$painted, [$ny, $nx]);
                $flg = 1;
            }
        }
    }
    $new_territory[$turn] = $painted;
    if ($flg) {
        $pass = 0;
    }
    # 連続パス
    if (!$flg && !$pass) {
        $pass = 1;
        $flg = 1;
    }
    $turn = 1 - $turn;
}

#けっかはっぴょ~♪
print join(' ',@score)."\n";
print $score[0] > $score[1] ? "A\n" : "B\n";

コメント☆

アイコン: (未実装)

トラックバック


トップページへ