2016-05-24 10 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

y'を返すように意図されるもの 'continent_size世界、X、言葉での状態に編集してください。小さな例が役に立つでしょう。 –

答えて

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 #=> 4world.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 
関連する問題