#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define rep(i,n) for(int i=0;i<n;i++)
const int dx[] = {-1, 0, 1, 0};
const int dy[] = { 0,-1, 0, 1};

struct NODE{
	int x,y;
	int count;
	char sw;
};
bool operator<(const NODE &a,const NODE &b){
	return a.count > b.count;
}

int w,h;
bool isWrong(const NODE &n){
	if(n.x > w+1 || n.y > h+1)return true;
	if(n.x <  0  || n.y <  0 )return true;
	return false;
}
bool isEdge(const NODE &n){
	if(n.x == 0 || n.x == w+1)return true;
	if(n.y == 0 || n.y == h+1)return true;
	return false;
}

int main(){
	while(cin >> w >> h, w){
		char map[102][102];
		rep(i,102)rep(j,102)map[i][j] = '.';
		NODE t; t.count = 0, t.sw = '.';
		
		for(int i=1;i<=h;i++){
			for(int j=1;j<=w;j++){
				cin >> map[i][j];
				if(map[i][j] == '&')t.y = i, t.x = j , map[i][j] = '.';
			}
		}
		
		int memo[102][102];
		rep(i,102)rep(j,102)memo[i][j] = (1<<21);
		
		priority_queue<NODE> Q;
		Q.push(t);
		while(Q.size()){
			NODE q = Q.top(); Q.pop();
			if(memo[q.y][q.x] <= q.count)continue;
			
			if(isEdge(q)){
				cout << q.count << endl;
				break;
			}
			memo[q.y][q.x] = q.count;
			rep(i,4){
				NODE nt;
				nt.x = q.x+dx[i], nt.y = q.y+dy[i], nt.count = q.count;
				if(isWrong(nt))continue;
				if( q.sw == '#' && map[nt.y][nt.x] == '.')nt.count++;
				nt.sw = map[nt.y][nt.x];
				
				Q.push(nt);		
			}
		}
	}
}