https://codeforces.com/problemset/problem/510/B
题意:给定一个n*m的的矩阵,矩阵只包含26个大写字母,矩阵中相邻并且相同的字符可以联通,问矩阵中是否存在数量>=4的环。
思路:视每个位置为一个node,进行编号,然后创建边。直接在图上进行dfs,如果dfs的过程中遇到了访问过的字符,说明有环。
总结:dfs的时候一开始忘记考虑所有的位置了。题目要求数量>4,会不会出现数量为3的环?不会,因为在矩阵中环至少是4个元素,3条共享边才行,3个元素不管怎么排列,都无法首位相接。
inline void solve() {int n, m;cin >> n >> m;std::vector<std::string> s(n);for (int i = 0; i < n; ++i) {cin >> s[i];}vector<vector<int>> al(n * m + 1);for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {int now = i * m + j;if (j) {int left = now - 1;if (s[i][j] == s[i][j - 1]) {al[now].push_back(left);al[left].push_back(now);}}if (i) {int up = now - m;if (s[i][j] == s[i - 1][j]) {al[now].push_back(up);al[up].push_back(now);}}}}std::vector<bool> visit(n * m + 1, false);auto dfs = [&](auto&& self, int u, int p) ->bool{bool ok = false;visit[u] = true;for (const auto& v : al[u]) {if (v == p) {continue;}if (visit[v]) {return true;}ok = ok || self(self, v, u);}return ok;};for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {if (visit[i * m + j]) {continue;}if (dfs(dfs, i * m + j, -1)) {cout << "Yes\n";return;}}}cout << "No" << '\n';
}