1.w和h的顺序搞反了
2.模拟往一个方向滑的时候用不同的数字表示不同的情况(find函数)
3.深搜终止条件不能忘
4.复制粘贴相似代码要谨慎
题目就是直接四个方向搜就ok。虽然调试样例调试了很久,但是一把直接AC爽。
#include <cstdio> #include <algorithm> using namespace std; #define INF 100000 int maps[102][102]; int w, h; int sx, sy; int vx[] = {0, 0, 1, -1}; int vy[] = {1, -1, 0, 0}; int find(int k, int x, int y) { int ans = 0; for(;;){ x += vx[k];y += vy[k]; if(x < 1 || x > w || y < 1 ||y > h) return -1; if(maps[x][y] == 1) return ans; if(maps[x][y] == 3) return INF; ans++; } } int dfs(int x, int y, int cnt) { int cmd, ans = -1; if(cnt > 10) return -1; if((cmd = find(0, x, y)) > 0 && cmd < INF){ maps[x][y + cmd + 1] = 0; int temp; if((temp = dfs(x, y + cmd, cnt + 1)) > 0) ans = ans == -1?temp:(min(ans, temp)); //printf("0000 %d\n", ans); maps[x][y + cmd + 1] = 1; }else if(cmd == INF) return (cnt < 10) ? cnt + 1 : -1; if((cmd = find(1, x, y)) > 0 && cmd < INF){ maps[x][y - cmd - 1] = 0; int temp; if((temp = dfs(x, y - cmd, cnt + 1)) > 0) ans = ans == -1?temp:(min(ans, temp)); maps[x][y - cmd - 1] = 1; }else if(cmd == INF) return (cnt < 10) ? cnt + 1 : -1; if((cmd = find(2, x, y)) > 0 && cmd < INF){ maps[x + cmd + 1][y] = 0; int temp; if((temp = dfs(x + cmd, y, cnt + 1)) > 0) ans = ans == -1?temp:(min(ans, temp)); maps[x + cmd + 1][y] = 1; }else if(cmd == INF) return (cnt < 10) ? cnt + 1 : -1; if((cmd = find(3, x, y)) > 0 && cmd < INF){ maps[x - cmd - 1][y] = 0; int temp; if((temp = dfs(x - cmd, y, cnt + 1)) > 0) ans = ans == -1?temp:(min(ans, temp)); maps[x - cmd - 1][y] = 1; }else if(cmd == INF) return (cnt < 10) ? cnt + 1 : -1; return ans; } int main() { while(scanf("%d%d", &h, &w) && w) { for(int i = 1; i <= w; i++) for(int j = 1; j <= h; j++) { scanf("%d", &maps[i][j]); if(maps[i][j] == 2) {sx = i; sy = j;} } printf("%d\n", dfs(sx, sy, 0)); } return 0; }
