题目链接:https://codeforces.com/contest/1607/problem/F
看过题解后,觉得这题难度确实不是很高,但是要AC还是有挺困难的。直接DFS超内存了,非得搞个栈来使用,主要是考虑到循环圈里的点贡献是相同的,就很好写了。
注意到出边界和进循环两种情况即可。
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
const int N = 2e3 + 5;
int t, n, m, num[N][N], d[N][N];
char g[N][N];
stack<pair<int,int> > st;
int main(void) {
// freopen("in.txt", "r", stdin);
scanf("%d", &t);
while (t--) {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%s", g[i] + 1);
for (int j = 1; j <= m; j++) {
num[i][j] = d[i][j] = 0;
}
}
auto ok = [&n, &m](int row, int col) {
return row >= 1 && col >= 1 && row <= n && col <= m;
};
int rr = 1, cc = 1, dd = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (!num[i][j]) {
int r = i, c = j, dep = 0;
while (ok(r, c) && d[r][c] == 0) {
d[r][c] = ++dep;
st.push(make_pair(r, c));
if (g[r][c] == 'U') r--;
else if (g[r][c] == 'D') r++;
else if (g[r][c] == 'L') c--;
else if (g[r][c] == 'R') c++;
}
int res = 0;
if (ok(r, c)) { // 有循环
if (!num[r][c]) {
int cycle = dep - d[r][c] + 1;
for (int i = 0; i < cycle; i++) {
pair<int, int> p = st.top();
st.pop();
num[p.first][p.second] = cycle;
}
}
res = num[r][c];
}
while (!st.empty()) {
pair<int, int> p = st.top();
st.pop();
num[p.first][p.second] = ++res;
}
if (dd < num[i][j]) {
rr = i;
cc = j;
dd = num[i][j];
}
}
}
}
printf("%d %d %d\n", rr, cc, dd);
}
return 0;
}