首页 > 代码库 > HDU 1072 (不一样的入队条件) Nightmare
HDU 1072 (不一样的入队条件) Nightmare
之前的BFS都是需要一个标记数组,但这个题不一样,因为可能一个格子不止走一次。
那么我们就要寻找新的入队条件:left比上次经过的时候大才入队(left表示上次经过该点时剩余的时间)。
为什么呢?我们重复走过一个点只有一个可能,那就是为了去取那个,所以如果取完后再回头经过这个点的时候剩余时间变多了,我们的目的就达到了。
left数组初值为0
优化:
重置时间的装置最多取一次就够了,所以可以再开一个标记数组vis记录装置是否用过。
1 //#define LOCAL 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 7 struct Point 8 { 9 int x, y;10 int steps;11 int time;12 }start, end;13 14 int map[10][10], vis[10][10], left[10][10];15 int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};16 int row, col;17 18 void BFS(void)19 {20 queue<Point> qu;21 start.time = 6, start.steps = 0;22 qu.push(start);23 while(!qu.empty())24 {25 Point fir = qu.front();26 qu.pop();27 if(fir.time == 0) continue;28 if(fir.x == end.x && fir.y == end.y)29 {30 printf("%d\n", fir.steps);31 return;32 }33 if(map[fir.x][fir.y] == 4)34 fir.time = 6;35 for(int i = 0; i < 4; ++i)36 {37 int xx = fir.x + dir[i][0];38 int yy = fir.y + dir[i][1];39 if(xx<0 | xx>=row | yy<0 | yy>=col | (!map[xx][yy]))40 continue;41 Point next;42 next.x = xx, next.y = yy;43 next.time = fir.time - 1;44 next.steps = fir.steps + 1;45 if(map[xx][yy] == 4 && vis[xx][yy])46 continue;47 if(next.time > left[xx][yy])48 {49 left[xx][yy] = next.time;50 qu.push(next);51 }52 }53 }54 printf("-1\n");55 }56 57 int main(void)58 {59 #ifdef LOCAL60 freopen("1072in.txt", "r", stdin);61 #endif62 63 int T;64 scanf("%d", &T);65 while(T--)66 {67 scanf("%d%d", &row, &col);68 for(int i = 0; i < row; ++i)69 for(int j = 0; j < col; ++j)70 {71 scanf("%d", &map[i][j]);72 if(map[i][j] == 2)73 start.x = i, start.y = j;74 if(map[i][j] == 3)75 end.x = i, end.y = j;76 }77 memset(vis, 0, sizeof(vis));78 memset(left, 0, sizeof(left));79 BFS();80 }81 return 0;82 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。