B. Fox And Two Dots
https://codeforces.com/problemset/problem/510/B
題意:給定一個(gè)n*m的的矩陣,矩陣只包含26個(gè)大寫(xiě)字母,矩陣中相鄰并且相同的字符可以聯(lián)通,問(wèn)矩陣中是否存在數(shù)量>=4的環(huán)。
思路:視每個(gè)位置為一個(gè)node,進(jìn)行編號(hào),然后創(chuàng)建邊。直接在圖上進(jìn)行dfs,如果dfs的過(guò)程中遇到了訪問(wèn)過(guò)的字符,說(shuō)明有環(huán)。
總結(jié):dfs的時(shí)候一開(kāi)始忘記考慮所有的位置了。題目要求數(shù)量>4,會(huì)不會(huì)出現(xiàn)數(shù)量為3的環(huán)?不會(huì),因?yàn)樵诰仃囍协h(huán)至少是4個(gè)元素,3條共享邊才行,3個(gè)元素不管怎么排列,都無(wú)法首位相接。
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';
}

浙公網(wǎng)安備 33010602011771號(hào)