B. Fox And Two Dots
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';
}

浙公网安备 33010602011771号