paizaリバーシの操作

最近はpaizaというサイトのもんだいをときどきといてます^▽^;

そんななかでAランクレベルアップ問題にあるSTEP 5 リバーシの操作というもんだいをといたのできき☆彡の解答をぺたり☆

けっこうくふうしたつもりです(>▽<;; アセアセ

my $input_line = <STDIN>;
chomp $input_line;
my ($H, $W, $Y, $X) = split(/ /,$input_line);
###  外枠を '_' で囲む
my @board = ('_' x ($W + 2));
for (my $a = 0; $a < $H; ++$a) {
    $input_line = <STDIN>;
    chomp $input_line;
    push(@board, '_'.$input_line.'_');
}
push(@board, '_' x ($W + 2));
substr($board[$Y + 1], $X + 1, 1, '*');
for (my $dy = -1; $dy <= 1; ++$dy) {
    for (my $dx = -1; $dx <= 1; ++$dx) {
        next if $dy == 0 && $dx == 0;
        my $ny = $Y + $dy + 1;
        my $nx = $X + $dx + 1;
        my $flg = 0;
        my $t = substr($board[$ny], $nx, 1);
        last if $t eq '*';
        ### はさんでいる?
        while($t ne '_') {
            if ($t eq '*') {
                $flg = 1;
                last;
            }
            $ny += $dy;
            $nx += $dx;
            $t = substr($board[$ny], $nx, 1);
        }
        ### はさんでるよ!
        if ($flg) {
            $ny = $Y + $dy + 1;
            $nx = $X + $dx + 1;
            $t = substr($board[$ny], $nx, 1);
            for(; $t ne '*'; $ny += $dy, $nx += $dx, $t = substr($board[$ny], $nx, 1)) {
                substr($board[$ny], $nx, 1, '*');
            }
        }
    }
}
for (my $a = 1; $a <= $H; ++$a) {
    print substr($board[$a], 1, $W)."\n";
}

コメント☆

アイコン: (未実装)

トラックバック


トップページへ