0

2D配列内に領域があり、隣接するセルをチェックする必要があることがあります。通常、私は、次の操作を行います:これはポイントにどのように多くの直角に隣接するセルを計算します例外なくグリッド内の隣接するセルを見つける

adjacentCells = (world[y+1][x]==1)+(world[y-1]==1)+(world[y][x+1]==1)+(world[y][x-1]==1) 

(x、y)を1に等しい問題は、私のx場合は、この方法では、マトリックスを包むことをやって、ありますまたはy座標が0(上端または左端)であり、点(x、y)が別の端にある場合は例外が発生します。これにより、コードは次のようになります。

def adjacentCells(x,y): 
    total=0 
    if x==0: 
     total += 1 
    else: 
     total += world[y][x-1] 
    if y==0: 
     total += 1 
    else: 
     total += world[y-1][x] 
    try: 
     total += world[y][x+1] 
    except: 
     total += 1 
    try: 
     total += world[y+1][x] 
    except: 
     total += 1 
    return total 

この問題を解決する方法は、一番上の例のように簡単ですか?

答えて

1

私はそれをこのようなものだろう。だから、あなたはそれを使用する前に、各1が有効である可能性のあるネイバーのリストを取得しますが、チェック

def adjacentCells(x, y): 
    neighbours = [(x-1, y), (x, y-1), (x+1, y), (x, y+1)] 
    return sum(
     world[b][a] if 0 <= b < len(world) and 0 <= a < len(world[b]) 
     else 1 
     for (a,b) in neighbours) 

を。

境界セルの隣接セルが1ではなく0として数えられる場合は、単純になりますが、使用する前に隣接セルのリストをフィルタリングするだけです。

+0

ありがとう、これは完璧に動作します! – Douglas

1

最大4つのセルの値を加算するだけのことは、各ケースごとにコードを書くだけです。セルの場所ごとに1行必要です。ループ構造を使用するよりも時間がかかるかもしれませんが、ループオーバーヘッドは避けてください。

また、読んで理解するのが比較的簡単で、何らかの理由で必要な場所を特別なケースにするのが簡単になります。

は、ここで私が何を意味するかです:

world = [[1, 1, 1, 1], 
     [1, 1, 1, 1], 
     [1, 1, 1, 1]] 

MIN_X, MAX_X = 0, len(world[0])-1 
MIN_Y, MAX_Y = 0, len(world)-1 

def adjacentCells(x, y): 
    return((world[ y][x-1] if MIN_Y <= y <= MAX_Y and MIN_X <= x-1 <= MAX_X else 1) 
     + (world[ y][x+1] if MIN_Y <= y <= MAX_Y and MIN_X <= x+1 <= MAX_X else 1) 
     + (world[y-1][ x] if MIN_Y <= y-1 <= MAX_Y and MIN_X <= x <= MAX_X else 1) 
     + (world[y+1][ x] if MIN_Y <= y+1 <= MAX_Y and MIN_X <= x <= MAX_X else 1)) 

print(adjacentCells(0, 0)) # -> 4 
print(adjacentCells(1, 1)) # -> 4 
関連する問題