2016-05-24 5 views
0

Итак, код работает отлично, если я пытаюсь найти размер земли посередине, но это не удается при расчете размера маленькой земли в углу. Как мне вернуть 0, если он начнет проверку земли за пределами заданных массивов?Как мне определить массив, который не существует?

M = 'land' 
o = 'water' 

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

def continent_size world, x, y 
    if world[x][y] != 'land' 
    return 0 
    end 

    size = 1 
    world[x][y] = 'counted land' 

    size = size + continent_size(world, x-1, y-1) 
    size = size + continent_size(world, x , y-1) 
    size = size + continent_size(world, x+1, y-1) 
    size = size + continent_size(world, x-1, y ) 
    size = size + continent_size(world, x+1, y ) 
    size = size + continent_size(world, x-1, y+1) 
    size = size + continent_size(world, x , y+1) 
    size = size + continent_size(world, x+1, y+1) 

    size 
end 

puts continent_size(world, 3, 5) 
+0

Исправьте изложить в словах, что 'continent_size мир, х, y' предназначена для возврата. Небольшой пример был бы полезен. –

ответ

1

Как насчет некоторых сторожевых пунктов в верхней части метода, как:

# make sure we don't attempt to index into an array at less than zero 
return 0 if x < 0 
return 0 if y < 0 

# make sure there is a value in the requested slot 
return 0 unless world[x] 
return 0 unless world[x][y] 
0
def continent_size(world, row, col) 
    rows = ([row-1, 0].max..[row+1, world.size-1].min).to_a 
    cols = ([col-1,0].max..[col+1, world.first.size-1].min).to_a 
    rows.product(cols).count { |r,c| world[r][c] == M } 
end 

world.size.times { |r| world.first.size.times { |c| 
    puts "[#{r},#{c}] -> #{continent_size(world, r, c)}" } } 
[0,0] -> 1 
[0,1] -> 2 
[0,2] -> 3 
[0,3] -> 2 
[0,4] -> 1 
[0,5] -> 0 
[1,0] -> 1 
[1,1] -> 3 
[1,2] -> 5 
[1,3] -> 4 
[1,4] -> 2 
[1,5] -> 0 
[2,0] -> 1 
[2,1] -> 3 
[2,2] -> 5 
[2,3] -> 4 
[2,4] -> 3 
[2,5] -> 1 
[3,0] -> 0 
[3,1] -> 1 
[3,2] -> 2 
[3,3] -> 2 
[3,4] -> 2 
[3,5] -> 1 

Для

row = 0 
col = 3 

шаги заключаются в следующем. (Примечание world_size #=> 4 и world.first.size #=> 6.)

rows = ([row-1, 0].max..[row+1, world.size-1].min).to_a 
    #=> ([-1,0].max..[1,3].min).to_a 
    #=> (0..1).to_a 
    #=> [0, 1] 
cols = ([col-1,0].max..[col+1,world[0].size-1].min).to_a 
    #=> ([2,0].max..[4,5].min).to_a 
    #=> (2..4).to_a 
    #=> [2,3,4] 
a = rows.product(cols) 
    #=> [[0, 2], [0, 3], [0, 4], [1, 2], [1, 3], [1, 4]] 
a.count { |r,c| world[r][c] == M } 
    #=> 2 
Смежные вопросы