迷路
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#