$ • 7个月前
using namespace std; int n, step = 0, ans = 10000; bool map[105][105], vis[105][105];
void dfs(int x, int y) {
if (vis[x][y] == false && map[x][y] == true) {
vis[x][y] = true;
if (x + 1 <= n) {
dfs(x + 1, y);
}
if (x - 1 >= 1) {
dfs(x - 1, y);
}
if (y + 1 <= n) {
dfs(x, y + 1);
}
if (y - 1 >= 1) {
dfs(x, y - 1);
}
}
}
void findfirst() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (map[i][j] == true) {
dfs(i, j);
return;
}
}
}
}
void dfs2(int x, int y) {
if (step > ans) {
return;
}
if (vis[x][y] == false && map[x][y] == false) {
vis[x][y] = true;
step++;
if (x + 1 <= n) {
dfs2(x + 1, y);
}
if (x - 1 >= 1) {
dfs2(x - 1, y);
}
if (y + 1 <= n) {
dfs2(x, y + 1);
}
if (y - 1 >= 1) {
dfs2(x, y - 1);
}
vis[x][y] = false;
step--;
}
if (vis[x][y] == false && map[x][y] == true) {
if (ans > step) {
ans = step;
}
}
}
int main() {
cin >> n;
int v;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
scanf("%d", &v);
if (v == 0) {
map[i][j] = false;
} else {
map[i][j] = true;
}
}
}
findfirst();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (vis[i][j] == true) {
if (i + 1 <= n) {
dfs2(i + 1, j);
}
if (i - 1 >= 1) {
dfs2(i - 1, j);
}
if (j + 1 <= n) {
dfs2(i, j + 1);
}
if (j - 1 >= 1) {
dfs2(i, j - 1);
}
}
}
}
printf("%d", ans);
return 0;
}
评论:
请先登录,才能进行评论