题目链接:https://www.luogu.org/problemnew/show/P1162
这道题主要是如何区分在“1”内部和在“1”外部的“0”。刚开始我想的是遍历用一组数据标记状态来区分。但是这样是不能区分“1”内外的“0”的。然后呢就是能不能先把“1”外围的“0”全部都标记出去,只要“0”处于“1”的外边,那么从外围开始搜索就必然能够搜索的这个“0”并且标记它。这时候就要有一点技巧的进行储存矩阵。矩阵从1开始储存,搜索矩阵的范围从0开始到N + 1。这样确保所有的外围“0”都可以被搜索到。
代码:
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
const int MAX_N = 100;
int a[MAX_N][MAX_N] = {0};
int N;
int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
void DFS(int x, int y) {
for (int i = 0; i < 4; i++) {
int xx = x + dx[i]; int yy = y + dy[i];
if (a[xx][yy] == 0 && xx >= 0 && xx <= N + 1 && yy >= 0 && yy <= N + 1) {
a[xx][yy] = -1; DFS (xx, yy);
}
}
}
void solve () {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (a[i][j] == -1)cout << 0 << " ";
else if (a[i][j] == 0) cout << 2 << " ";
else cout << 1 << " ";
}
cout << endl;
}
}
int main() {
cin >> N;
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
cin >> a[i][j];
DFS(0, 0);
solve();
return 0;
}