P1162 填涂颜色——DFS、连通性
题目描述
由数字
如果从某个
0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 1 0 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0 1 1 1 0 1 1 2 2 1 1 1 2 2 2 1 1 2 2 1 2 1 1 1 1 1 1 1
输入格式
每组测试数据第一行一个整数
接下来
方阵内只有一个闭合圈,圈内至少有一个
输出格式
已经填好数字
输入输出样例 #1
输入 #1
6 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 1 1 1 1 1
输出 #1
0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 2 2 1 1 1 2 2 2 1 1 2 2 2 2 1 1 1 1 1 1 1
说明/提示
对于
题解
#include <iostream> #include <cstring> using namespace std; const int MAXN = 35; int a[MAXN][MAXN]; int n; // 四个方向的偏移量 int dx[] = {-1, 1, 0, 0}; int dy[] = {0, 0, -1, 1}; // 深度优先搜索函数,标记能到达边界的 0 void dfs(int x, int y) { // 判断越界或者不是 0 的情况 if (x < 1 || x > n || y < 1 || y > n || a[y][x] != 0) { return; } // 标记为 -1,表示能到达边界 a[y][x] = -1; for (int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny = y + dy[i]; dfs(nx, ny); } } int main() { cin >> n; memset(a, 0, sizeof(a)); for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cin >> a[i][j]; } } // 从边界的 0 开始进行深度优先搜索 for (int i = 1; i <= n; i++) { if (a[1][i] == 0) dfs(i, 1); if (a[n][i] == 0) dfs(i, n); if (a[i][1] == 0) dfs(1, i); if (a[i][n] == 0) dfs(n, i); } // 将未被标记的 0 改为 2 for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (a[i][j] == 0) { a[i][j] = 2; } else if (a[i][j] == -1) { a[i][j] = 0; } } } // 输出结果 for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cout << a[i][j] << " "; } cout << endl; } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了