Problem - 616C - Codeforces
Problem - 616C - Codeforces
C. The Labyrinth
如果是直接对\(*\)去跑dfs或者bfs的话无疑是会超时的
既然如此,那我们可以去对 \(.\) 跑搜索,将各个连通的 \(.\) 块标号并计算出连通块内的点的数量,然后去遍历\(*\)的时候只需要上下左右跑一下计算即可
啊,在\(bfs\)或\(dfs\)的时候千万不要每次都开\(n\times m\)的空间去标记点,只需要在外面开一个就好!
#include <bits/stdc++.h> #define debug(a) cout<<#a<<"="<<a<<'\n'; using namespace std; using i64 = long long; typedef pair<i64, i64> PII; vector<int> ans(1e6); int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m; cin >> n >> m; vector<string> g(n); for (auto &i : g) cin >> i; int u[] = {1, -1, 0, 0}, v[] = {0, 0, 1, -1}; vector<vector<int>> G(n,vector<int>(m,0)); int num = 0; vector vis(n, vector<bool>(m)); auto bfs = [&](int x, int y) { queue<PII> Q; G[x][y] = num; Q.push({x, y}); i64 res = 1; vis[x][y] = true; while (Q.size()) { auto [x1, y1] = Q.front(); Q.pop(); for (int i = 0; i < 4; i ++) { int dx = x1 + u[i], dy = y1 + v[i]; if (dx < 0 || dy < 0 || dx >= n || dy >= m || vis[dx][dy] || g[dx][dy] == '*') continue; Q.push({dx, dy}); vis[dx][dy] = true; res ++; G[dx][dy] = num; } } return res % 10; }; for (int i = 0; i < n; i ++) { for (int j = 0; j < m; j ++) { if (g[i][j] == '.' && !G[i][j]) { ++ num; ans[num] = bfs(i, j); } } } for (int i = 0; i < n; i ++) { for (int j = 0; j < m; j ++) { if (g[i][j] == '*') { int res = 1; int f[4]{0}; for (int k = 0; k < 4; k ++) { int dx = i + u[k], dy = j + v[k]; if (dx < 0 || dy < 0 || dx >= n || dy >= m || g[dx][dy] == '*' ) continue; if(G[dx][dy] == f[0] || G[dx][dy] == f[1] || G[dx][dy] == f[2] || G[dx][dy] == f[3]) continue; f[k] = G[dx][dy]; res += ans[G[dx][dy]]; } cout << res % 10; } else cout << g[i][j]; } cout << '\n'; } return 0; }
本文作者:Ke_scholar
本文链接:https://www.cnblogs.com/Kescholar/p/17735562.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步