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 Rust (judge verdict: Accepted)

use std::collections::VecDeque;

fn main(){
  loop {
    let nm: Vec<usize> = read_vec();
    let n = nm[0];
    let m = nm[1];

    if n == 0 && m == 0 { break; }

    let mut mp: Vec<Vec<char>> = vec![vec!['.'; n+2]; m+2];
    let mut dv: Vec<Vec<usize>> = vec![vec![10000; n+2]; m+2];
    
    let mut si: usize = 0;
    let mut sj: usize = 0;
    
    for i in 1 .. m+1 {
      let ts: String = read();
      let tl: Vec<char> = ts.chars().collect();
      for j in 1 .. n+1 {
        mp[i][j] = tl[j-1];
        if mp[i][j] == '&' { si = i; sj = j; }
      }
    }
    
    dv[si][sj] = 0;
    
    let mut que: VecDeque<(usize, usize)> = VecDeque::new();
    que.push_back((si, sj));
    
    let d: Vec<(isize, isize)> = vec![(1,0),(-1, 0), (0, 1), (0, -1)];
    
    loop {
      match que.pop_front() {
        None => { break; },
        Some((i, j)) => {
          for &(di, dj) in &d {
            let ti = (i as isize) + di;
            let tj = (j as isize) + dj;
            if ti < 0 || tj < 0 || ti > (m as isize)+1 || tj > (n as isize)+1 { continue; }
            let ni: usize = ti as usize;
            let nj: usize = tj as usize;
            let tc: usize =  dv[i][j] + if mp[i][j] != '#' && mp[ni][nj] == '#' {1} else {0};
            if tc < dv[ni][nj] {
              dv[ni][nj] = tc;
              que.push_back((ni, nj));
            }
          }
        },
      }
    }
    println!("{}", dv[0][0]);
  }
}

fn read<T>() -> T
  where T: std::str::FromStr,
        T::Err: std::fmt::Debug
{
  let mut buf = String::new();
  std::io::stdin().read_line(&mut buf).expect("failed to read");
  buf.trim().parse().unwrap()
}

fn read_vec<T>() -> Vec<T>
  where T: std::str::FromStr,
        T::Err: std::fmt::Debug
{
  let mut buf = String::new();
  std::io::stdin().read_line(&mut buf).expect("failed to read");
  buf.split_whitespace().map(|e| e.parse().unwrap()).collect()
}