题目链接:http://poj.org/problem?id=3009 真是不知道怎么回事儿,昨天晚上我写了一晚上没AC,今天重写了一遍就果断AC了。 这道题是使一个应该说是拐了一点儿弯儿的dfs,就是当且仅当遇到障碍的时候停止,剩下的时间全都一直在走,而且需要判断的是下一步是否是障碍,而不是当前所在位置是否是障碍,而且,需要维护的是障碍会消失,所以需要用dfs来维持地图的环境,搜索是逐点搜索的,就是用一个循环把不该停的地方跳过去就行了。。
view code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <cmath> 6 #include <algorithm> 7 using namespace std; 8 int w, h, map[25][25], sx, sy, ans; 9 bool ju; 10 const int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; 11 bool inMap(int x, int y) 12 { 13 return x >= 0 && x < h && y >= 0 && y < w; 14 } 15 void init() 16 { 17 for (int i = 0; i < h; i++) 18 for (int j = 0; j < w; j++) 19 if (map[i][j] == 2) {sx = i; sy = j;} 20 ans = (1 << 31) - 1; ju = 0; 21 } 22 void dfs(int x, int y, int step) 23 { 24 if (step > 10) return; 25 for (int i = 0; i < 4; i++) 26 { 27 if (map[x + dir[i][0]][y + dir[i][1]] == 1 || !inMap(x + dir[i][0], y + dir[i][1])) continue; 28 int xx = x, yy = y; 29 while (map[xx + dir[i][0]][yy + dir[i][1]] != 1) 30 { 31 xx += dir[i][0]; yy += dir[i][1]; 32 if (!inMap(xx, yy)) break; 33 if (map[xx][yy] == 3) 34 { 35 ans = min(step, ans); 36 ju = 1; 37 return; 38 } 39 } 40 if (inMap(xx, yy)) 41 { 42 map[xx + dir[i][0]][yy + dir[i][1]] = 0; 43 dfs(xx, yy, step + 1); 44 map[xx + dir[i][0]][yy + dir[i][1]] = 1; 45 } 46 } 47 } 48 int main() 49 { 50 while (~scanf("%d%d", &w, &h)) 51 { 52 if (!w && !h) break; 53 memset(map, 0, sizeof(map)); 54 for (int i = 0; i < h; i++) 55 for (int j = 0; j < w; j++) scanf("%d", &map[i][j]); 56 init(); 57 dfs(sx, sy, 1); 58 if (ju) printf("%d\n", ans); 59 else printf("-1\n"); 60 } 61 return 0; 62 } 63
|