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;
}