题目概况
题目链接: https://www.luogu.com.cn/problem/P1162
难度: 普及-
题目分析
简化题目: 把图中1包裹起来的部分全部写成2。
涉及知识点: 深度优先搜索DFS
解题思路:
我们可以反其道而行之。采用染色法,将1围栏外的元素全部标记,然后剩下没有被染色的部分即为围栏以内的。
在输入时要把围墙提前染色标记。在0,0~n+1,n+1搜索(因为还可能有边边上的没被围住的,这点比较特殊,比如下面的一组数据),再染色。
6
0 0 1 1 1 0
1 1 1 0 1 0
1 0 0 0 0 1
1 1 0 1 1 1
0 1 0 1 0 0
0 1 1 1 0 0
代码拆解及要点分析
老规矩,普及-的题目不写拆解分析
完整代码
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN = 35;
int n;
int dir[4][2]={{1,0},{-1,0},{0,-1},{0,1}}; //四个方向
int ma[MAXN][MAXN], vis[MAXN][MAXN]; //ma是图,vis是标记数组
bool in(int a, int b) { //范围内判断函数
return a >= 0 && a <= n + 1 && b >= 0 && b <= n + 1;
}
void dfs(int x, int y) {
for (int i = 0; i < 4; i++) {
int tx = x + dir[i][0];
int ty = y + dir[i][1];
if (in(tx, ty) && vis[tx][ty] == 0) { //在范围内,这不是个围墙
vis[tx][ty] = 1; //染个色
dfs(tx, ty); //继续
}
}
}
int main() {
cin >> n;
for(int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> ma[i][j];
if (ma[i][j] == 1 ){
vis[i][j] = 1; //围墙提前染色标记
}
}
}
dfs(0,0);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (vis[i][j] == 0) { //如果经过dfs没有被染色,那么就在围墙内
cout << 2 << " ";
} else {
cout << ma[i][j] << " "; //原模样输出
}
}
cout << endl;
}
return 0;
}
该博客主要解析了洛谷P1162题目的解法,难度为普及级。通过深度优先搜索DFS解决,策略是先对围墙外的元素进行标记,未被染色部分即为目标区域。博主分享了完整的代码实现。
1204

被折叠的 条评论
为什么被折叠?



