D#剪纸游戏#
ans统计单个连通块的小正方形个数,
set<int>sx,sy记录这些小方块的横坐标,纵坐标,
如果 sx.size()*sy.size()==ans那么矩形数sum++;
#include<bits/stdc++.h> using namespace std; int n,m; char g[1005][1005]; int d1[4]={0,0,-1,1}; int d2[4]={-1,1,0,0},ans=0,sum=0; set<int>sx,sy; void dfs(int x,int y) { g[x][y]='*'; for(int i=0;i<4;i++) { int x1=x+d1[i],y1=y+d2[i]; if(x1>=n||y1>=m||x1<0||y1<0) continue; if(g[x1][y1]=='*') continue; sx.insert(x1),sy.insert(y1); ans++; dfs(x1,y1); } } int main() { cin>>n>>m; for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>g[i][j]; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(g[i][j]=='.') { ans=1; sx.clear(),sy.clear(); sx.insert(i),sy.insert(j); dfs(i,j); if(ans==sy.size()*sx.size()) sum++; } } cout<<sum; return 0; }