Problem:
城の堀

いま、忍者が城外から天守閣に忍び入ろうと計画を立てています。この忍者は地面を走ったり、堀の中を泳いだりすることは難なくできますが、堀から這い上がることはとても苦手なので、忍者は堀に入る回数をできるだけ少なくしたいと考えています。

お城の見取図を入力とし、城外から天守閣に至るまでに、堀から這い上がらなくてはならない最小回数を出力するプログラムを作成して下さい。お城の見取図は二次元格子として与えられます。見取り図に描かれた記号には、天守閣の位置を示す「&」と堀の位置を示す「#」の位置が記され、そのほかの地点には「.」（半角ピリオド）が記されています。なお、お城には天守閣は一つだけあるものとし、忍者は走ったり泳いだりして移動するときに東西南北方向に1マスずつ移動するものとし、斜めには移動しません。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロ２つの行で示されます。各データセットは以下の形式で与えられます。

n m
c1,1c1,2...c1,n
c2,1c2,2...c2,n
:
cm,1cm,2...cm,n

１行目に見取図の東西の幅 n と 南北の幅 m (1 ≤ n, m ≤ 100) が与えられる。続くm 行に見取り図の i 行目の情報が与えられる。各情報は記号「&」、「#」、「.」からなる長さ n の文字列である。

データセットの数は 50 を越えない。

Output

データセットごとに堀から這い上がらなくてはならない最小回数（整数）を１行に出力します。

Sample Input

5 5
.###.
#...#
#.&.#
#...#
.###.
18 15
..####....####....
####..####....####
#...............##
.#.############.##
#..#..........#.##
.#.#.########.#.##
#..#.#......#.#.##
.#.#....&...#.#.##
#..#........#.#.##
.#.#.########.#.##
#..#..........#.##
.#.############.##
#...............##
.#################
##################
9 10
#########
........#
#######.#
#.....#.#
#.###.#.#
#.#&#.#.#
#.#...#.#
#.#####.#
#.......#
#########
9 3
###...###
#.#.&.#.#
###...###
0 0

Output for the Sample Input

1
2
0
0

Solution in JAVA (judge verdict: Wrong Answer)

import java.awt.geom.*;
import java.io.*;
import java.util.*;

public class Main{
	char [][] data;
	int w,h;
	int [] vx = {0,1,0,-1};
	int [] vy = {1,0,-1,0};
	
	class State implements Comparable<State>{
		int nowx,nowy, cost;

		public State(int nowx, int nowy, int cost) {
			this.nowx = nowx;
			this.nowy = nowy;
			this.cost = cost;
		}

		@Override
		public int compareTo(State o) {
			return this.cost - o.cost;
		}

		@Override
		public String toString() {
			return "State [nowx=" + nowx + ", nowy=" + nowy + ", cost=" + cost
					+ "]";
		}
		
	}
	
	private void doit(){
		Scanner sc = new Scanner(System.in);
		while(true){
			w = sc.nextInt();
			h = sc.nextInt();
			if((w|h) == 0) break;
			data = new char[h][w];
			int sx = -1, sy = -1;
			for(int i = 0; i < h; i++){
				String s = sc.next();
				data[i] = s.toCharArray();
				int res = s.indexOf('&');
				if(res >= 0){
					sy = i;
					sx = res;
				}
			}
			int res = solve(sx,sy);
			System.out.println(res);
		}
	}

	private int solve(int sx, int sy) {
		int INF = 1 << 24;
		PriorityQueue<State> open = new PriorityQueue<State>();
		open.add(new State(sx, sy, 0));
		int[][] close = new int[h][w];
		for(int i = 0; i < h; i++){
			Arrays.fill(close[i], INF);
		}
		close[sy][sx] = 0;
		int ans = INF;
		while(! open.isEmpty()){
			State now = open.poll();
			if(isGoal(now)){
				ans = now.cost;
				break;
			}
			for(int i = 0; i < 4; i++){
				int xx = now.nowx + vx[i];
				int yy = now.nowy + vy[i];
				int nextcost = now.cost;
				if(data[yy][xx] == '#'){
					nextcost++;
				}
				if(close[yy][xx] <= nextcost) continue;
				open.add(new State(xx, yy, nextcost));
				close[yy][xx] = nextcost;
			}
		}
		return ans;
	}

	private boolean isGoal(State now) {
		if(now.nowx == 0 || now.nowy == 0 || now.nowx == w-1 || now.nowy == h-1) return true;
		return false;
	}

	private void debug(Object... o) { System.out.println("debug = " + Arrays.deepToString(o)); }

	public static void main(String[] args) {
		new Main().doit();
	}
}