提交时间:2026-05-22 14:25:04
运行 ID: 88949
#include <iostream> #include <vector> #include <queue> #include <algorithm> using namespace std; int main() { // 四个方向:上下左右 int dx[] = {-1, 1, 0, 0}; int dy[] = {0, 0, -1, 1}; int n, m; cin >> n >> m; vector<string> maze(n); for (int i = 0; i < n; i++) cin >> maze[i]; // 字符映射 L=0, Q=1, B=2, S=3 auto get = [&](char c) { if (c == 'L') return 0; if (c == 'Q') return 1; if (c == 'B') return 2; return 3; }; // 建图 + 入度 vector<vector<vector<pair<int, int>>>> adj(n, vector<vector<pair<int, int>>>(m)); vector<vector<int>> in(n, vector<int>(m, 0)); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { int now = get(maze[i][j]); int nxt = (now + 1) % 4; for (int d = 0; d < 4; d++) { int x = i + dx[d]; int y = j + dy[d]; if (x < 0 || x >= n || y < 0 || y >= m) continue; if (get(maze[x][y]) == nxt) { adj[i][j].emplace_back(x, y); in[x][y]++; } } } } // DP 数组 + 拓扑队列 vector<vector<int>> dp(n, vector<int>(m, 0)); queue<pair<int, int>> q; // 起点:所有 L for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) if (maze[i][j] == 'L') q.emplace(i, j); // 拓扑排序 + DP while (!q.empty()) { auto [i, j] = q.front(); q.pop(); for (auto [x, y] : adj[i][j]) { // 走到 S 就完成一轮,+1 int add = (maze[x][y] == 'S') ? 1 : 0; if (dp[x][y] < dp[i][j] + add) dp[x][y] = dp[i][j] + add; in[x][y]--; if (in[x][y] == 0) q.emplace(x, y); } } // 检查是否有环(存在入度 >0 的点) for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) if (in[i][j] > 0) { cout << -1 << endl; return 0; } // 找最大值 int ans = 0; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) ans = max(ans, dp[i][j]); cout << ans << endl; return 0; }