Submission #31297214


Source Code Expand

macro make_array(value, *dims)
  {% for dim in dims %} Array.new({{dim}}) { {% end %}
    {{ value }}
  {% for dim in dims %} } {% end %}
end

h, w = gets.to_s.split.map(&.to_i)
s = Array.new(h) { gets.to_s }

sy = sx = gy = gx = -1
g = Array.new(h) do |y|
  Array.new(w) do |x|
    case s[y][x]
    when '1'..'9'
      s[y][x].to_i
    when 's'
      sy = y
      sx = x
      0
    when 'g'
      gy = y
      gx = x
      10000000 # ゴールは無条件で進めるほど明るい
    when '#'
      -1
    else
      raise "bad input #{s[y][x]}"
    end
  end
end

pr = Problem.new(h, w, g, sy, sx, gy, gx)
ans = pr.solve
pp ans == 0.0 ? -1 : ans

class Problem
  DIR = [{-1, 0}, {0, -1}, {1, 0}, {0, 1}]
  INF = 1e9.to_i64
  getter h : Int32
  getter w : Int32
  getter g : Array(Array(Int32))
  getter sy : Int32
  getter sx : Int32
  getter gy : Int32
  getter gx : Int32

  def initialize(@h, @w, @g, @sy, @sx, @gy, @gx)
  end

  def solve
    lo = 0.0
    hi = 10.0
    (lo..hi).bsearch do |v|
      !query(v)
    end
  end

  # 明るさvを保ったままゴールできるか
  def query(v)
    depth = make_array(INF, h, w)
    depth[sy][sx] = 0
    seen = make_array(false, h, w)
    seen[sy][sx] = true
    q = Deque.new([{sy, sx}])
    while q.size > 0
      y, x = q.shift
      break if y == gy && x == gx
      each(y, x) do |ny, nx|
        next if wall?(ny, nx)
        next if seen[ny][nx]
        seen[ny][nx] = true
        t = depth[y][x] + 1
        next if g[ny][nx] * 0.99 ** t < v
        depth[ny][nx] = t
        q << {ny, nx}
      end
    end
    depth[gy][gx] != INF
  end

  def outside?(y, x)
    y < 0 || h <= y || x < 0 || w <= x
  end

  def wall?(y, x)
    g[y][x] == -1
  end

  def each(y, x)
    DIR.each do |dy, dx|
      ny = y + dy
      nx = x + dx
      next if outside?(ny, nx)
      yield ny, nx
    end
  end
end

Submission Info

Submission Time
Task C - 暗闇帰り道
User tamura2004
Language Crystal (0.33.0)
Score 100
Code Size 1962 Byte
Status AC
Exec Time 1535 ms
Memory 12436 KiB

Judge Result

Set Name all
Score / Max Score 100 / 100
Status
AC × 64
Set Name Test Cases
all 00_mini_01.txt, 00_mini_02.txt, 00_mini_03.txt, 00_mini_04.txt, 00_mini_05.txt, 00_sample_01.txt, 00_sample_02.txt, 01_rnd_01.txt, 01_rnd_02.txt, 01_rnd_03.txt, 01_rnd_04.txt, 01_rnd_05.txt, 01_rnd_06.txt, 01_rnd_07.txt, 01_rnd_08.txt, 01_rnd_09.txt, 01_rnd_10.txt, 01_rnd_11.txt, 01_rnd_12.txt, 01_rnd_13.txt, 01_rnd_14.txt, 01_rnd_15.txt, 01_rnd_16.txt, 01_rnd_17.txt, 01_rnd_18.txt, 01_rnd_19.txt, 01_rnd_20.txt, 02_maxrnd_01.txt, 02_maxrnd_02.txt, 02_maxrnd_03.txt, 02_maxrnd_04.txt, 02_maxrnd_05.txt, 02_maxrnd_06.txt, 02_maxrnd_07.txt, 02_maxrnd_08.txt, 02_maxrnd_09.txt, 02_maxrnd_10.txt, 02_maxrnd_11.txt, 02_maxrnd_12.txt, 02_maxrnd_13.txt, 02_maxrnd_14.txt, 02_maxrnd_15.txt, 02_maxrnd_16.txt, 02_maxrnd_17.txt, 02_maxrnd_18.txt, 02_maxrnd_19.txt, 03_hard_01.txt, 03_hard_02.txt, 03_hard_03.txt, 03_hard_04.txt, 03_hard_05.txt, 03_hard_06.txt, 03_hard_07.txt, 03_hard_08.txt, 04_open_01.txt, 04_open_02.txt, 05_minihard_01.txt, 05_minihard_02.txt, 05_minihard_03.txt, 05_minihard_04.txt, 05_minihard_05.txt, 05_minihard_06.txt, 05_minihard_07.txt, 05_minihard_08.txt
Case Name Status Exec Time Memory
00_mini_01.txt AC 12 ms 3800 KiB
00_mini_02.txt AC 3 ms 3820 KiB
00_mini_03.txt AC 3 ms 3760 KiB
00_mini_04.txt AC 4 ms 3844 KiB
00_mini_05.txt AC 3 ms 3664 KiB
00_sample_01.txt AC 7 ms 4084 KiB
00_sample_02.txt AC 5 ms 4116 KiB
01_rnd_01.txt AC 1151 ms 10256 KiB
01_rnd_02.txt AC 192 ms 7476 KiB
01_rnd_03.txt AC 41 ms 6648 KiB
01_rnd_04.txt AC 111 ms 6632 KiB
01_rnd_05.txt AC 27 ms 5324 KiB
01_rnd_06.txt AC 11 ms 4976 KiB
01_rnd_07.txt AC 44 ms 5972 KiB
01_rnd_08.txt AC 266 ms 8828 KiB
01_rnd_09.txt AC 396 ms 10224 KiB
01_rnd_10.txt AC 517 ms 12436 KiB
01_rnd_11.txt AC 283 ms 8700 KiB
01_rnd_12.txt AC 184 ms 7436 KiB
01_rnd_13.txt AC 51 ms 6684 KiB
01_rnd_14.txt AC 702 ms 8732 KiB
01_rnd_15.txt AC 311 ms 8676 KiB
01_rnd_16.txt AC 34 ms 7464 KiB
01_rnd_17.txt AC 342 ms 8700 KiB
01_rnd_18.txt AC 14 ms 5436 KiB
01_rnd_19.txt AC 35 ms 6712 KiB
01_rnd_20.txt AC 16 ms 5612 KiB
02_maxrnd_01.txt AC 404 ms 10332 KiB
02_maxrnd_02.txt AC 288 ms 10224 KiB
02_maxrnd_03.txt AC 422 ms 10188 KiB
02_maxrnd_04.txt AC 717 ms 10344 KiB
02_maxrnd_05.txt AC 437 ms 10316 KiB
02_maxrnd_06.txt AC 1363 ms 10120 KiB
02_maxrnd_07.txt AC 191 ms 10224 KiB
02_maxrnd_08.txt AC 135 ms 10268 KiB
02_maxrnd_09.txt AC 1319 ms 10252 KiB
02_maxrnd_10.txt AC 269 ms 10264 KiB
02_maxrnd_11.txt AC 1226 ms 10404 KiB
02_maxrnd_12.txt AC 613 ms 10232 KiB
02_maxrnd_13.txt AC 803 ms 10276 KiB
02_maxrnd_14.txt AC 962 ms 10244 KiB
02_maxrnd_15.txt AC 209 ms 10380 KiB
02_maxrnd_16.txt AC 749 ms 10216 KiB
02_maxrnd_17.txt AC 693 ms 10276 KiB
02_maxrnd_18.txt AC 118 ms 10280 KiB
02_maxrnd_19.txt AC 108 ms 10248 KiB
03_hard_01.txt AC 1503 ms 10216 KiB
03_hard_02.txt AC 1486 ms 10264 KiB
03_hard_03.txt AC 505 ms 10292 KiB
03_hard_04.txt AC 515 ms 10380 KiB
03_hard_05.txt AC 1522 ms 10320 KiB
03_hard_06.txt AC 1457 ms 10356 KiB
03_hard_07.txt AC 499 ms 10412 KiB
03_hard_08.txt AC 522 ms 10356 KiB
04_open_01.txt AC 1535 ms 10220 KiB
04_open_02.txt AC 1463 ms 10276 KiB
05_minihard_01.txt AC 16 ms 4780 KiB
05_minihard_02.txt AC 15 ms 4804 KiB
05_minihard_03.txt AC 10 ms 4876 KiB
05_minihard_04.txt AC 13 ms 4764 KiB
05_minihard_05.txt AC 15 ms 4852 KiB
05_minihard_06.txt AC 13 ms 4688 KiB
05_minihard_07.txt AC 10 ms 4752 KiB
05_minihard_08.txt AC 13 ms 4764 KiB