题面
农夫约翰总是想要一个农场的地图,所以他拍摄了一张 N 行 M 列的卫星照片。一部分的照片看起来像这样:
.................. ..#####.......##.. ..#####......##... .................. #.......###.....#. #.....#####.......
他认为每个联通块都是一个谷仓或一头奶牛。联通块由若干个彼此水平或垂直相邻的 '#' 符号组成。以下的照片被认为是两个联通块:
.... .#.. ..#. ....
农夫约翰认为一个联通块是谷仓,当且仅当它是一个完整的矩形,否则该联通块是一头奶牛。在第一张照片上面,有三个谷仓(大小分别为 2×12×1 , 2×52×5 和 1×11×1 )和两头奶牛。 计算他的卫星照片中谷仓和奶牛的数量。
输入
行 11:两个空格分隔的整数: N 和 M ( 0N,M≤80)。
行 2..N+1:行 i+1 表示照片的行 i 包含M 个字符(且不含空格)。
输出
行1:照片中的谷仓数量。
行2:照片中的奶牛数量。
样例
输入
5 8 #####..# #####.## ......#. .###...# .###..##输出
2 2
难点在于怎么求是不是矩形,我是用(最大x值-最小x值+1) *(最大y值-最小y值+1) 再判断和图形面积是否相等就行了
#include <bits/stdc++.h>
using namespace std;
int n , m , x1 , x2 , y1 , y2 , cow , farm , tmp;
char a[100][100];
int f[100][100];
int fx[5] = {0 , 0 , 1 , 0 , -1} , fy[5] = {0 , 1 , 0 , -1 , 0};
void dfs(int x,int y) {f[x][y]=1;tmp++;x1=min(x1,x);y1=min(y1,y);x2=max(x2,x);y2=max(y2,y);int tx , ty;for(int i = 1; i <= 4; i++) {tx = x+fx[i];ty = y+fy[i];if(tx >= 1 && ty >= 1 && tx<=n && ty<=m && !f[tx][ty] && a[tx][ty]=='#') {dfs(tx,ty);}}
}
int main(){scanf("%d%d" , &n , &m);for ( int i = 1 ; i <= n ; i++ )for ( int j = 1 ; j <= m ; j++ )cin >> a[i][j];for(int i = 1; i <= n; i++) {for(int j = 1; j <= m; j++) {x1=INT_MAX , y1=INT_MAX , x2=0 , y2=0;if(!f[i][j]&&a[i][j]=='#') {tmp = 0;dfs(i,j);int k = (1+x2-x1) * (1+y2-y1); if(k == tmp) farm++;else cow++;}}}printf("%d\n%d" , farm , cow);return 0;
}