0

在学习编程 (Chris Pine) 中,有一个挑战是改进一段计算网格上连续图块的代码。如果瓷砖与网格边缘接壤,他给你的代码将失败——你需要解决这个问题。

关键是0如果瓷砖是o或者您正在检查的坐标不在网格上,则返回。

M = 'land'
o = 'water'

world = [[o,o,o,o,o,o,o,o,o,o,o],
         [o,o,o,o,M,M,o,o,o,o,o],
         [o,o,o,o,o,o,o,o,M,M,o],
         [o,o,o,M,o,o,o,o,o,M,o],
         [o,o,o,M,o,M,M,o,o,o,o],
         [o,o,o,o,M,M,M,M,o,o,o], 
         [o,o,o,M,M,M,M,M,M,M,o],
         [o,o,o,M,M,o,M,M,M,o,o],
         [o,o,o,o,o,o,M,M,o,o,o], 
         [o,M,o,o,o,M,o,o,o,o,o],
         [o,o,o,o,o,o,o,o,o,o,o]]

def continent_size world, x, y 
  if world[y][x] != 'land'
    # Either it's water or we already
    # counted it, but either way, we don't # want to count it now.
    return 0
  end

我已经以一种方式解决了这个问题,但我想知道为什么另一种方式不起作用。这是我的工作解决方案:

if y > world.length || x > world[y].length || world[y][x] != 'land'
  return 0
end

这是我首先尝试的,但不起作用:

if world[y][x].nil?
  return 0
elsif world[y][x] != 'land'
  return 0
end

在 IRB 中,如果我查找一个不存在的坐标,如world[5][15]返回值,nil那么我期待world[y][x].nil?工作,但我不明白为什么它不工作。

谢谢!

4

1 回答 1

3

y当在网格之外时,这将失败。这是因为world[y]will be nil,然后会引发尝试引用的异常[x];即world[y][x]会阅读nil[x]

world = [[1]]

world[0][0] # 1
world[0][1] # nil
world[1][0] # NoMethodError: undefined method `[]' for nil:NilClass

对于解决方案,您可以使用:

def continent_size(world, x, y)
  0 if world[y] && world[y][x] != 'land'
end
于 2013-05-06T20:56:32.787 回答