SP904 IMAGE - Image Perimeters题解

题目传送门


思路

我们可以进行两遍 Dfs,第一遍 Dfs,把这个点与它连通的图形打标记,第二遍 Dfs,统计图形的周长。

怎样统计周长???

如果到了边界,就统计四个方向是否走过,如果没走过,就统计答案。


代码如下:

#include <bits/stdc++.h>
using namespace std;
int n, m, x, y, ans;
char a[100][100];
void dfs (int x, int y) {
	if (x < 1 || y < 1 || x > n || y > m)
		return ; 
	if (a[x][y] == '.' || a[x][y] == 'S')
		return ;
	a[x][y] = 'S';
	dfs (x + 1, y) ;
	dfs (x, y + 1) ;
	dfs (x - 1, y) ;
	dfs (x, y - 1) ;
	dfs (x + 1, y + 1) ;
	dfs (x + 1, y - 1) ;
	dfs (x - 1, y - 1) ;
	dfs (x - 1, y + 1) ;
}
void bfs (int x, int y) {
	if (x < 1 || y < 1 || x > n || y > m)
		return ;
	if (a[x][y] != 'S')
		return ;
	a[x][y] = 'D';
	if (a[x + 1][y] != 'S' && a[x + 1][y] != 'D')	
		 ans ++;
	if (a[x - 1][y] != 'S' && a[x - 1][y] != 'D')
		ans ++;
	if (a[x][y + 1] != 'S' && a[x][y + 1] != 'D')
		 ans ++;
	if (a[x][y - 1] != 'S' && a[x][y - 1] != 'D')
		ans ++;		
	bfs (x + 1, y) ;
	bfs (x, y + 1) ;
	bfs (x - 1, y) ;
	bfs (x, y - 1) ;
	bfs (x + 1, y + 1) ;
	bfs (x + 1, y - 1) ;
	bfs (x - 1, y - 1) ;
	bfs (x - 1, y + 1) ;
}
int main () {
	while (1) {
		ans = 0;
		scanf ("%d %d %d %d", &n, &m, &x, &y) ;
		if (n == 0 && m == 0 && x == 0 && y == 0)
			return 0;
		for (int i = 0; i <= 51; i ++)
			for (int j = 0; j <= 51; j ++)
				a[i][j] = 0;
		for (int i = 1; i <= n; i ++)
			for (int j = 1; j <= m; j ++)
				cin >> a[i][j];
		
		dfs (x, y) ;
		bfs (x, y) ;
		printf ("%d \n", ans) ;
	}
	return 0;
}

完结散花 \(\sim\sim\sim\)

posted @ 2023-07-01 11:16  liukejie  阅读(3)  评论(0编辑  收藏  举报