時刻に伴う移動

paizaのレベルアップ問題「時刻に伴う移動」 もといてみちゃった^-^*
わりとみじかいコードでできたかな~(〃⌒ー⌒〃)ゞ エヘヘ
my %reldirec = (
    'L' => 3,
    'R' => 1
);

my @mvcord = (
    [-1,  0],
    [ 0,  1],
    [ 1,  0],
    [ 0, -1]
);

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

my @field = ();

for (my $a = 0; $a < $H; ++$a) {
    $input_line = <STDIN>;
    chomp $input_line;
    push(@field,[split(//, $input_line)]);
}

my $event_count = 0;
my @event_list = ();
for (my $c = 0; $c < $N; ++$c) {
    $input_line = <STDIN>;
    chomp $input_line;
    push(@event_list, [split(/ /, $input_line)]);
}
push(@event_list, ['Inf', '']);

$field[$sy][$sx] = '*';

my $di = 0;

for (my $g_time = 0; $g_time <= 99; ++$g_time) {
    my $od = $di;
    if ($g_time == $event_list[$event_count][0]) {
        $od = ($od + $reldirec{$event_list[$event_count][1]}) % 4;
        ++$event_count;
    }
    my $stop = 0;
    my $oy = $sy + $mvcord[$od][0];
    my $ox = $sx + $mvcord[$od][1];
    if(
        $oy >= 0 && $oy < $H &&
        $ox >= 0 && $ox < $W &&
        $field[$oy][$ox] ne '#'
    ){
        $di = $od;
        $sy = $oy;
        $sx = $ox;
        $field[$sy][$sx] = '*';
    } else {
        $stop = 1;
    }
    if ($stop) {
        print "Stop";
        last;
    } else {
        print $sy.' '.$sx."\n";
    }
}

(補足:文字列の'Inf'は数値で評価すると無限大と扱われる)

トップページへ