第一行输入两个整数
——纸张的行数与列数。
接下来
行,每行输入一个长度为
的由 `'.'` 与 `'*'` 组成的字符串,描述残缺纸张的形状:
`'.'` 代表该方格已被剪去;
`'*'` 代表该方格仍保留。
输出一个整数,表示被剪下来的图案中长方形的数量。
4 10 *.*.*...** ...***.*.. .**..*.*.. *..*****..
4
可以看出,图中恰有一个正方形,三个长方形,共计四个长方形。
#include <iostream> #include <vector> #include <queue> using namespace std; int dx[4]={1,-1,0,0}; int dy[4]={0,0,1,-1}; int n,m; vector<string> s; vector<vector<bool>> visited; bool bfs(int a,int b) { int maxx=0,mayy=0; int mixx=1e9,miyy=1e9; queue<pair<int,int>> q; q.push({a,b}); int count=1; visited[a][b]=true; while(!q.empty()) { auto [x,y]=q.front(); q.pop(); maxx=max(maxx,x); mayy=max(mayy,y); mixx=min(mixx,x); miyy=min(miyy,y); for(int i=0;i<4;i++) { int nx=dx[i]+x; int ny=dy[i]+y; if(nx>=1 && nx<=n && ny>=1 && ny<=m &&!visited[nx][ny] &&s[nx][ny]=='.') { visited[nx][ny]=true; q.push({nx,ny}); count++; } } } int area = (maxx - mixx + 1) * (mayy - miyy + 1); return count == area; } int main() { int ans=0; cin>>n>>m; s.resize(n+1); visited.resize(n+1,vector<bool>(m+1,false)); for(int i=1;i<=n;i++) { cin>>s[i]; s[i]=' '+s[i]; } for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(s[i][j]=='.' && !visited[i][j]) { bool f=bfs(i,j); if(f) ans++; } } } cout<<ans<<endl; }