import sys
from collections import deque
N = int ( sys .stdin .readline ( ) )
H = [ ]
W = [ ]
maps = [ ]
dx = [ 0 , 0 , 1 , -1 ]
dy = [ 1 , -1 , 0 , 0 ]
for _ in range ( N) :
h, w = map ( int , sys .stdin .readline ( ) .split ( ) )
H.append ( h)
W.append ( w)
map_ = [ ]
for _ in range ( h) :
map_.append ( list ( sys .stdin .readline ( ) ) [ :-1 ] )
maps.append ( map_)
def solution( h, w, map_, prisoner_q) :
global VISITED
finds = [ ]
outs = [ ]
while prisoner_q:
x, y, open_door = prisoner_q.pop ( )
for sx, sy in zip ( dx, dy) :
newx = x+sx
newy = y+sy
if validation( newx, newy, h, w) :
if not VISITED[ newx] [ newy] :
if map_[ newx] [ newy] == '.' :
prisoner_q.appendleft ( ( newx, newy, open_door) )
VISITED[ newx] [ newy] = True
elif map_[ newx] [ newy] == '#' :
prisoner_q.appendleft ( ( newx, newy, open_door+[ ( newx, newy) ] ) )
VISITED[ newx] [ newy] = True
elif map_[ newx] [ newy] == '$' :
finds.append ( open_door)
elif not validation( newx, newy, h, w) :
outs.append ( open_door)
return finds, outs
def validation( x, y, h, w) :
if x>= 0 and y>= 0 and x< h and y< w:
return True
return False
def find_prisoner( H, W, map_, prisoner_q) :
global VISITED
for h in range ( H) :
for w in range ( W) :
if map_[ h] [ w] == '$' :
prisoner_q.appendleft ( ( h, w, [ ] ) )
for h, w, map_ in zip ( H, W, maps) :
prisoner_q1 = deque( )
prisoner_q2 = deque( )
find_prisoner( h, w, map_, prisoner_q1)
prisoner_q2.append ( prisoner_q1.pop ( ) )
#죄수 1의 외부로 나가는 방법과 다른 죄수를 만나는 방법 서치
VISITED = [ [ False ] *w for _ in range ( h) ]
VISITED[ prisoner_q1[ 0 ] [ 0 ] ] [ prisoner_q1[ 0 ] [ 1 ] ] = True
finds1, outs1 = solution( h, w, map_, prisoner_q1)
#지나온 문들의 갯수를 저장
result1 = [ len ( set ( find+out) ) for find in finds1 for out in outs1]
#죄수 2의 외부로 나가는 방법과 다른 죄수를 만나는 방법 서치
VISITED = [ [ False ] *w for _ in range ( h) ]
VISITED[ prisoner_q2[ 0 ] [ 0 ] ] [ prisoner_q2[ 0 ] [ 1 ] ] = True
finds2, outs2 = solution( h, w, map_, prisoner_q2)
#지나온 문들의 갯수를 저장
result2 = [ len ( set ( find+out) ) for find in finds2 for out in outs2]
#외부로만 다니는게 가장 적을 수 있으므로 외부로 나가는 방법들만 저장
result3 = [ len ( set ( out1+out2) ) for out1 in outs1 for out2 in outs2]
#가장 작은 수 print
print ( min ( result1+result2+result3) )
aW1wb3J0IHN5cwpmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQoKTiA9IGludChzeXMuc3RkaW4ucmVhZGxpbmUoKSkKSCA9IFtdClcgPSBbXQptYXBzID0gW10KZHggPSBbMCwwLDEsLTFdCmR5ID0gWzEsLTEsMCwwXQpmb3IgXyBpbiByYW5nZShOKToKICAgIGgsIHcgPSBtYXAoaW50LHN5cy5zdGRpbi5yZWFkbGluZSgpLnNwbGl0KCkpCiAgICBILmFwcGVuZChoKQogICAgVy5hcHBlbmQodykKICAgIG1hcF8gPSBbXQogICAgZm9yIF8gaW4gcmFuZ2UoaCk6CiAgICAgICAgbWFwXy5hcHBlbmQobGlzdChzeXMuc3RkaW4ucmVhZGxpbmUoKSlbOi0xXSkKICAgIG1hcHMuYXBwZW5kKG1hcF8pCiAgICAKCmRlZiBzb2x1dGlvbihoLHcsIG1hcF8scHJpc29uZXJfcSk6CiAgICBnbG9iYWwgVklTSVRFRAogICAgZmluZHMgPSBbXQogICAgb3V0cyA9IFtdCiAgICB3aGlsZSBwcmlzb25lcl9xOgogICAgICAgIHgsIHksIG9wZW5fZG9vciA9IHByaXNvbmVyX3EucG9wKCkKICAgICAgICBmb3Igc3gsIHN5IGluIHppcChkeCxkeSk6CiAgICAgICAgICAgIG5ld3ggPSB4K3N4CiAgICAgICAgICAgIG5ld3kgPSB5K3N5CiAgICAgICAgICAgIGlmIHZhbGlkYXRpb24obmV3eCxuZXd5LGgsdyk6CiAgICAgICAgICAgICAgICBpZiBub3QgVklTSVRFRFtuZXd4XVtuZXd5XToKICAgICAgICAgICAgICAgICAgICBpZiBtYXBfW25ld3hdW25ld3ldPT0nLic6CiAgICAgICAgICAgICAgICAgICAgICAgIHByaXNvbmVyX3EuYXBwZW5kbGVmdCgobmV3eCxuZXd5LG9wZW5fZG9vcikpCiAgICAgICAgICAgICAgICAgICAgICAgIFZJU0lURURbbmV3eF1bbmV3eV09VHJ1ZQogICAgICAgICAgICAgICAgICAgIGVsaWYgbWFwX1tuZXd4XVtuZXd5XT09JyMnOgogICAgICAgICAgICAgICAgICAgICAgICBwcmlzb25lcl9xLmFwcGVuZGxlZnQoKG5ld3gsbmV3eSxvcGVuX2Rvb3IrWyhuZXd4LG5ld3kpXSkpCiAgICAgICAgICAgICAgICAgICAgICAgIFZJU0lURURbbmV3eF1bbmV3eV09VHJ1ZQogICAgICAgICAgICAgICAgICAgIGVsaWYgbWFwX1tuZXd4XVtuZXd5XT09JyQnOgogICAgICAgICAgICAgICAgICAgICAgICBmaW5kcy5hcHBlbmQob3Blbl9kb29yKQogICAgICAgICAgICBlbGlmIG5vdCB2YWxpZGF0aW9uKG5ld3gsbmV3eSxoLHcpOgogICAgICAgICAgICAgICAgb3V0cy5hcHBlbmQob3Blbl9kb29yKQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgICAgICAgICAKICAgIHJldHVybiBmaW5kcywgb3V0cwoKZGVmIHZhbGlkYXRpb24oeCx5LGgsdyk6CiAgICBpZiB4Pj0wIGFuZCB5Pj0wIGFuZCB4PGggYW5kIHk8dzoKICAgICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIEZhbHNlCgpkZWYgZmluZF9wcmlzb25lcihILFcsIG1hcF8sIHByaXNvbmVyX3EpOgogICAgZ2xvYmFsIFZJU0lURUQKICAgIGZvciBoIGluIHJhbmdlKEgpOgogICAgICAgIGZvciB3IGluIHJhbmdlKFcpOgogICAgICAgICAgICBpZiBtYXBfW2hdW3ddPT0nJCc6CiAgICAgICAgICAgICAgICBwcmlzb25lcl9xLmFwcGVuZGxlZnQoKGgsdyxbXSkpCiAgICAgICAgICAgIAoKCmZvciBoLCB3LCBtYXBfIGluIHppcChILFcsbWFwcyk6CiAgICBwcmlzb25lcl9xMSA9IGRlcXVlKCkKICAgIHByaXNvbmVyX3EyID0gZGVxdWUoKQogICAgCiAgICBmaW5kX3ByaXNvbmVyKGgsdyxtYXBfLCBwcmlzb25lcl9xMSkKICAgIAogICAgcHJpc29uZXJfcTIuYXBwZW5kKHByaXNvbmVyX3ExLnBvcCgpKQogICAgI+yjhOyImCAx7J2YIOyZuOu2gOuhnCDrgpjqsIDripQg67Cp67KV6rO8IOuLpOuluCDso4TsiJjrpbwg66eM64KY64qUIOuwqeuylSDshJzsuZgKICAgIFZJU0lURUQgPSBbW0ZhbHNlXSp3IGZvciBfIGluIHJhbmdlKGgpXQogICAgVklTSVRFRFtwcmlzb25lcl9xMVswXVswXV1bcHJpc29uZXJfcTFbMF1bMV1dPVRydWUKICAgIGZpbmRzMSwgb3V0czEgPSBzb2x1dGlvbihoLHcsbWFwXyxwcmlzb25lcl9xMSkKICAgICPsp4DrgpjsmKgg66y465Ok7J2YIOqwr+yImOulvCDsoIDsnqUKICAgIHJlc3VsdDEgPSBbbGVuKHNldChmaW5kK291dCkpZm9yIGZpbmQgaW4gZmluZHMxIGZvciBvdXQgaW4gb3V0czFdCiAgICAKICAgICPso4TsiJggMuydmCDsmbjrtoDroZwg64KY6rCA64qUIOuwqeuyleqzvCDri6Trpbgg7KOE7IiY66W8IOunjOuCmOuKlCDrsKnrspUg7ISc7LmYCiAgICBWSVNJVEVEID0gW1tGYWxzZV0qdyBmb3IgXyBpbiByYW5nZShoKV0KICAgIFZJU0lURURbcHJpc29uZXJfcTJbMF1bMF1dW3ByaXNvbmVyX3EyWzBdWzFdXT1UcnVlCiAgICBmaW5kczIsIG91dHMyID0gc29sdXRpb24oaCx3LG1hcF8scHJpc29uZXJfcTIpCiAgICAj7KeA64KY7JioIOusuOuTpOydmCDqsK/siJjrpbwg7KCA7J6lCiAgICByZXN1bHQyID0gW2xlbihzZXQoZmluZCtvdXQpKWZvciBmaW5kIGluIGZpbmRzMiBmb3Igb3V0IGluIG91dHMyXQoKICAgICPsmbjrtoDroZzrp4wg64uk64uI64qU6rKMIOqwgOyepSDsoIHsnYQg7IiYIOyeiOycvOuvgOuhnCDsmbjrtoDroZwg64KY6rCA64qUIOuwqeuyleuTpOunjCDsoIDsnqUKICAgIHJlc3VsdDMgPSBbbGVuKHNldChvdXQxK291dDIpKSBmb3Igb3V0MSBpbiBvdXRzMSBmb3Igb3V0MiBpbiBvdXRzMl0KICAgIAogICAgI+qwgOyepSDsnpHsnYAg7IiYIHByaW50CiAgICBwcmludChtaW4ocmVzdWx0MStyZXN1bHQyK3Jlc3VsdDMpKQoKCg==