提交时间:2026-06-05 14:21:41

运行 ID: 89413

#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 105; // L:0 Q:1 B:2 S:3 char mp[MAXN][MAXN]; int n, m; // dp[x][y][sta]: 坐标(x,y)、状态sta,最大整轮数 int dp[MAXN][MAXN][4]; // in_stack: 当前递归栈标记,true表示正在遍历(用来判环) bool in_stack[MAXN][MAXN][4]; // 字符映射:c→对应编号 int get_id(char c) { if(c == 'L') return 0; if(c == 'Q') return 1; if(c == 'B') return 2; if(c == 'S') return 3; return -1; } // 下一状态:当前k,下一步要(k+1)%4 int nxt(int k) { return (k+1)%4; } int dx[4] = {-1,1,0,0}; int dy[4] = {0,0,-1,1}; bool has_loop = false; // 记忆化dfs int dfs(int x, int y, int sta) { if(has_loop) return 0; // 已经算过,直接返回 if(dp[x][y][sta] != -1) return dp[x][y][sta]; // 当前状态在递归栈里 = 出现环,无限 if(in_stack[x][y][sta]) { has_loop = true; return 0; } in_stack[x][y][sta] = true; int res = 0; int now_id = get_id(mp[x][y]); // 四个方向走 for(int d=0;d<4;d++) { int nx = x + dx[d]; int ny = y + dy[d]; if(nx<0||nx>=n||ny<0||ny>=m) continue; int nid = get_id(mp[nx][ny]); // 必须满足:下一格字符 = 下一状态需要的字符 if(nid == nxt(sta)) { int tmp = dfs(nx, ny, nxt(sta)); // 如果从S走到L(sta=3→0),完成一轮+1 if(sta == 3) { res = max(res, tmp + 1); } else { res = max(res, tmp); } } } dp[x][y][sta] = res; in_stack[x][y][sta] = false; return res; } int main() { cin >> n >> m; for(int i=0;i<n;i++) cin >> mp[i]; memset(dp, -1, sizeof(dp)); memset(in_stack, false, sizeof(in_stack)); int ans = 0; // 枚举所有起点:所有L位置,初始状态sta=0 for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(mp[i][j] == 'L') { int cur = dfs(i,j,0); ans = max(ans, cur); if(has_loop) break; } } if(has_loop) break; } if(has_loop) cout << -1 << endl; else cout << ans << endl; return 0; }