1 해설
-
0
文字教学
这道题是带状态的BFS问题,因为除了位置
(x,y),血量hp也是关键状态(同一位置不同血量是不同情况,需分别记录):- 状态定义:用
vis[x][y][h]记录“在位置(x,y)且血量为h”的状态是否已访问,避免重复搜索。 - BFS队列元素:存储当前位置
(x,y)、当前血量hp、已走步数step。 - 移动规则:每走一步血量减1,必须保证减后血量
>0(否则死亡);若走到鼠标格(4),血量补满到6。 - 终止条件:走到家(
3)时直接返回当前步数+1;队列空仍未到家返回-1。
代码
#include <bits/stdc++.h> using namespace std; int g[10][10], vis[10][10][7]; int n, m, sx, sy; int dx[4] = {-1, 1, 0, 0}; int dy[4] = {0, 0, -1, 1}; struct Node { int x, y, hp, step; }; int main() { cin >> n >> m; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cin >> g[i][j]; if (g[i][j] == 2) { sx = i; sy = j; } } } queue<Node> q; q.push({sx, sy, 6, 0}); vis[sx][sy][6] = 1; while (!q.empty()) { Node cur = q.front(); q.pop(); for (int d = 0; d < 4; ++d) { int nx = cur.x + dx[d]; int ny = cur.y + dy[d]; int nhp = cur.hp - 1; if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue; if (g[nx][ny] == 0) continue; if (nhp <= 0) continue; if (g[nx][ny] == 4) nhp = 6; if (vis[nx][ny][nhp]) continue; vis[nx][ny][nhp] = 1; if (g[nx][ny] == 3) { cout << cur.step + 1 << endl; return 0; } q.push({nx, ny, nhp, cur.step + 1}); } } cout << -1 << endl; return 0; } - 状态定义:用
- 1
정보
- ID
- 1845
- 시간
- 1000ms
- 메모리
- 128MiB
- 난이도
- 3
- 태그
- 제출 기록
- 1
- 맞았습니다.
- 1
- 아이디
京公网安备 11011102002149号