迷路

char arr[N][M+1] =
       {"#S######.#",
	"......#..#",
	".#.##.##.#",
	".#........",
	"##.##.####",
	"....#....#",
	".#######.#",
	"....#.....",
	".####.###.",
	"....#...G#",
};

で、迷路をする。最短距離を求めたい。
深さ優先検索すると、パンクするみたいなので、(#, ., Gの場合分けで3^n)
おそらく、

	"......#..#",
	".#.##.##.#",
	".#........",
           ↑ここの部分でループしてしまうからだと思われる。

一応、あっているかどうかわからないが、ソースのほうを。

int minimum = 1000;
int Min(int a, int b) {
	return (a > b) ? b : a;
}


int solve(int h, int w, int cnt) {
	int dir[][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
	for(int i = 0; i < 4; i++) {
			//配列が範囲内。
			if(h + dir[i][0] >= 0 && h + dir[i][0] < N && w + dir[i][1] >= 0 && w + dir[i][1] < M) {
				//おしまい
				if(arr[h + dir[i][0]][w + dir[i][1]] == '#') {
					continue;
				} else if (arr[h + dir[i][0]][w + dir[i][1]] == 'G') {
					minimum = Min(minimum, cnt);
					continue;
				} else if (arr[h + dir[i][0]][w + dir[i][1]] == '.') {
					solve(h + dir[i][0], w + dir[i][1], cnt+1);
				}
			}
	}
	return 1;
}

なので、幅優先検索を行う。

#S######.#  #0######.#  #0######.#  #0######.#
......#..#  ......#..#  .1....#..#  212...#..#
.#.##.##.#  .#.##.##.#  .#.##.##.#  .#.##.##.#
.#........  
##.##.####  
....#....#  
.#######.#  
....#.....  
.####.###.  
....#...G#