连通块数
发布日期:2021-05-07 06:58:31 浏览次数:29 分类:精选文章

本文共 1534 字,大约阅读时间需要 5 分钟。

连通块数

题目链接:

题目大意

有一个三维的立方体,我们说两个相邻的方块是同一个颜色当两个方块的值的绝对值小于 m m m

然后问你这个立方体有多少个连通块。

思路

这道题就爆搜。

每一个方块都看做一个点

先把一个方块相邻的方块都看一遍,如果是同一个颜色,就两个方框对应的点连边。
然后最后爆搜有多少个图中连通块,就是答案了。

代码

#include
#include
using namespace std;struct node { int to, nxt;}e[750010];int l, w, h, a[51][51][51], m, le[125010], KK, ans, in[125010];int dx[6] = { 1, -1, 0, 0, 0, 0}, dy[6] = { 0, 0, 1, -1, 0, 0}, dz[6] = { 0, 0, 0, 0, 1, -1};bool ch(int x, int y, int z) { if (x < 1 || x > l) return 0; if (y < 1 || y > w) return 0; if (z < 1 || z > h) return 0; return 1;}int getnum(int x, int y, int z) { return (x - 1) * w * h + (y - 1) * h + z;}void add(int x, int y) { e[++KK] = (node){ y, le[x]}; le[x] = KK;}void dfs(int now, int op) { in[now] = op; for (int i = le[now]; i; i = e[i].nxt) if (!in[e[i].to]) dfs(e[i].to, op);}int main() { // freopen("engineer.in", "r", stdin);// freopen("engineer.out", "w", stdout); scanf("%d %d %d", &l, &w, &h); scanf("%d", &m); for (int i = 1; i <= l; i++) for (int j = 1; j <= w; j++) for (int k = 1; k <= h; k++) scanf("%d", &a[i][j][k]); for (int i = 1; i <= l; i++) for (int j = 1; j <= w; j++) for (int k = 1; k <= h; k++) for (int s = 0; s < 6; s++) if (ch(i + dx[s], j + dy[s], k + dz[s]) && abs(a[i][j][k] - a[i + dx[s]][j + dy[s]][k + dz[s]]) <= m) add(getnum(i, j, k), getnum(i + dx[s], j + dy[s], k + dz[s])); for (int i = 1; i <= l * w * h; i++) if (!in[i]) { ans++; dfs(i, ans); } printf("%d", ans); fclose(stdin); fclose(stdout); return 0;}
上一篇:【笔记】排列组合公式、二项式定理
下一篇:【C语言】进制转换的两个例子

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2025年03月31日 18时00分13秒