Bailian4115 鸣人和佐助【BFS】

tech2022-08-25  106

4115:鸣人和佐助 总时间限制: 1000ms 内存限制: 65536kB 描述 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢?

已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置。地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要先打败大蛇丸的手下才能到这些位置。鸣人有一定数量的查克拉,每一个单位的查克拉可以打败一个大蛇丸的手下。假设鸣人可以往上下左右四个方向移动,每移动一个距离需要花费1个单位时间,打败大蛇丸的手下不需要时间。如果鸣人查克拉消耗完了,则只可以走到没有大蛇丸手下的位置,不可以再移动到有大蛇丸手下的位置。佐助在此期间不移动,大蛇丸的手下也不移动。请问,鸣人要追上佐助最少需要花费多少时间?

输入 输入的第一行包含三个整数:M,N,T。代表M行N列的地图和鸣人初始的查克拉数量T。0 < M,N < 200,0 ≤ T < 10 后面是M行N列的地图,其中@代表鸣人,+代表佐助。*代表通路,#代表大蛇丸的手下。 输出 输出包含一个整数R,代表鸣人追上佐助最少需要花费的时间。如果鸣人无法追上佐助,则输出-1。 样例输入 样例输入1 4 4 1 #@## **## ###+


样例输入2 4 4 2 #@## **## ###+


样例输出 样例输出1 6

样例输出2 4

问题链接:Bailian4115 鸣人和佐助 问题简述:(略) 问题分析:用BFS来解决,不解释。 程序说明:(略) 参考链接:(略) 题记:(略)

AC的C++语言程序如下:

/* Bailian4115 鸣人和佐助 */ #include <bits/stdc++.h> using namespace std; const int N = 200; char maze[N][N + 1]; int Chakra[N][N]; struct Node { int row, col, k, time; Node(int r, int c, int k2, int t):row(r), col(c), k(k2), time(t){} }; int dr[] = {-1, 1, 0, 0}; int dc[] = {0, 0, -1, 1}; const int DL = sizeof(dr) / sizeof(int); int main() { int m, n, k; while(~scanf("%d%d%d", &m, &n, &k)) { queue<Node> q; for(int i = 0; i < m; i++) scanf("%s", maze[i]); memset(Chakra, -1, sizeof(Chakra)); int tr, tc, cnt = 0; for(int i = 0; i < m; i++) for(int j = 0; j < n; j++) if(maze[i][j] == '@') { Chakra[i][j] = k; q.push(Node(i, j, k, 0)); if(++cnt == 2) break; } else if(maze[i][j] == '+') { tr = i; tc = j; if(++cnt == 2) break; } while(!q.empty()) { Node t = q.front(); if(t.row == tr && t.col == tc) break; q.pop(); for(int i = 0; i < DL; i++) { int nrow = t.row + dr[i]; int ncol = t.col + dc[i]; if(nrow < 0 || nrow >= m || ncol < 0 || ncol >= n) continue; if(t.k <= Chakra[nrow][ncol]) continue; if(maze[nrow][ncol] == '#') { if(t.k > 0) { Chakra[nrow][ncol] = t.k - 1; q.push(Node(nrow, ncol, t.k - 1, t.time + 1)); } } else { Chakra[nrow][ncol] = t.k; q.push(Node(nrow, ncol, t.k, t.time + 1)); } } } if(q.empty()) printf("-1\n"); else printf("%d\n", q.front().time); } return 0; }
最新回复(0)