import copy
""" スペースを整える(宙に浮いたぷよを落とす) """
def fix_space( a ):
for y in range( len(a)-1, 0, -1 ):
for x in range( len(a[y]) ):
if a[y][x] == '.':
for z in range( y-1, -1, -1 ):
if a[z][x] != '.':
a[y][x], a[z][x] = a[z][x], a[y][x]
break
""" 位置 (x,y) のぷよを起点に、c と同じ色の隣接するぷよの数を計算する """
def count_matched_puyo( a, x, y, c ):
if not (0 <= y < len(a)) or not (0 <= x < len(a[y])) or a[y][x] != c:
return 0
else:
a[y][x] = '.'
return 1 + \
count_matched_puyo( a, x-1, y, c ) + \
count_matched_puyo( a, x+1, y, c ) + \
count_matched_puyo( a, x, y-1, c ) + \
count_matched_puyo( a, x, y+1, c )
""" マッチするぷよを消す、消されたぷよがあれば真を返す """
def erase_matched_puyo( a ):
fix_space(a)
f, s = False, copy.deepcopy(a)
for y in range( len(a) ):
for x in range( len(a[y]) ):
c = a[y][x]
if c.isdigit() and count_matched_puyo( copy.deepcopy(s), x, y, c ) >= 4:
f, a[y][x] = True, '.'
return f
""" 連鎖数を計算する """
def get_num_of_chain( a ):
n = 0
while erase_matched_puyo(a) == True:
n += 1
return n
""" 問題を解く """
def solve( lines ):
a = list( list(line) for line in lines )
for line in a:
print( ''.join(line) )
print( '=> {}'.format( get_num_of_chain(a) ) )
solve( [ '0013', '0123', '122.', '013.', '0123' ] )
solve( [ '9.9.9.9.9.9', '.9.9.9.9.9.' ] )
solve( [ '0123', '3012', '2301', '1230' ] )
aW1wb3J0IGNvcHkKCiIiIiDjgrnjg5rjg7zjgrnjgpLmlbTjgYjjgovvvIjlrpnjgavmta7jgYTjgZ/jgbfjgojjgpLokL3jgajjgZnvvIkgIiIiCmRlZiBmaXhfc3BhY2UoIGEgKToKCWZvciB5IGluIHJhbmdlKCBsZW4oYSktMSwgMCwgLTEgKToKCQlmb3IgeCBpbiByYW5nZSggbGVuKGFbeV0pICk6CgkJCWlmIGFbeV1beF0gPT0gJy4nOgoJCQkJZm9yIHogaW4gcmFuZ2UoIHktMSwgLTEsIC0xICk6CgkJCQkJaWYgYVt6XVt4XSAhPSAnLic6CgkJCQkJCWFbeV1beF0sIGFbel1beF0gPSBhW3pdW3hdLCBhW3ldW3hdCgkJCQkJCWJyZWFrCgoiIiIg5L2N572uICh4LHkpIOOBruOBt+OCiOOCkui1t+eCueOBq+OAgWMg44Go5ZCM44GY6Imy44Gu6Zqj5o6l44GZ44KL44G344KI44Gu5pWw44KS6KiI566X44GZ44KLICIiIgpkZWYgY291bnRfbWF0Y2hlZF9wdXlvKCBhLCB4LCB5LCBjICk6CglpZiBub3QgKDAgPD0geSA8IGxlbihhKSkgb3Igbm90ICgwIDw9IHggPCBsZW4oYVt5XSkpIG9yIGFbeV1beF0gIT0gYzoKCQlyZXR1cm4gMAoJZWxzZToKCQlhW3ldW3hdID0gJy4nCgkJcmV0dXJuIDEgKyBcCgkJCWNvdW50X21hdGNoZWRfcHV5byggYSwgeC0xLCB5LCBjICkgKyBcCgkJCWNvdW50X21hdGNoZWRfcHV5byggYSwgeCsxLCB5LCBjICkgKyBcCgkJCWNvdW50X21hdGNoZWRfcHV5byggYSwgeCwgeS0xLCBjICkgKyBcCgkJCWNvdW50X21hdGNoZWRfcHV5byggYSwgeCwgeSsxLCBjICkKCiIiIiDjg57jg4Pjg4HjgZnjgovjgbfjgojjgpLmtojjgZnjgIHmtojjgZXjgozjgZ/jgbfjgojjgYzjgYLjgozjgbDnnJ/jgpLov5TjgZkgIiIiCmRlZiBlcmFzZV9tYXRjaGVkX3B1eW8oIGEgKToKCWZpeF9zcGFjZShhKQoJZiwgcyA9IEZhbHNlLCBjb3B5LmRlZXBjb3B5KGEpCglmb3IgeSBpbiByYW5nZSggbGVuKGEpICk6CgkJZm9yIHggaW4gcmFuZ2UoIGxlbihhW3ldKSApOgoJCQljID0gYVt5XVt4XQoJCQlpZiBjLmlzZGlnaXQoKSBhbmQgY291bnRfbWF0Y2hlZF9wdXlvKCBjb3B5LmRlZXBjb3B5KHMpLCB4LCB5LCBjICkgPj0gNDoKCQkJCWYsIGFbeV1beF0gPSBUcnVlLCAnLicKCXJldHVybiBmCgoiIiIg6YCj6Y6W5pWw44KS6KiI566X44GZ44KLICIiIgpkZWYgZ2V0X251bV9vZl9jaGFpbiggYSApOgoJbiA9IDAKCXdoaWxlIGVyYXNlX21hdGNoZWRfcHV5byhhKSA9PSBUcnVlOgoJCW4gKz0gMQoJcmV0dXJuIG4KCiIiIiDllY/poYzjgpLop6PjgY8gIiIiCmRlZiBzb2x2ZSggbGluZXMgKToKCWEgPSBsaXN0KCBsaXN0KGxpbmUpIGZvciBsaW5lIGluIGxpbmVzICkKCWZvciBsaW5lIGluIGE6CgkJcHJpbnQoICcnLmpvaW4obGluZSkgKQoJcHJpbnQoICc9PiB7fScuZm9ybWF0KCBnZXRfbnVtX29mX2NoYWluKGEpICkgKQoKc29sdmUoIFsgJzAwMTMnLCAnMDEyMycsICcxMjIuJywgJzAxMy4nLCAnMDEyMycgXSApCnNvbHZlKCBbICc5LjkuOS45LjkuOScsICcuOS45LjkuOS45LicgXSApCnNvbHZlKCBbICcwMTIzJywgJzMwMTInLCAnMjMwMScsICcxMjMwJyBdICkK