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';
}
posted @ 2025-11-05 11:50  _Yxc  阅读(4)  评论(0)    收藏  举报