ac

 •  1个月前


include

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;

}


评论:

请先登录,才能进行评论