首页 > 试题广场 >

剪纸游戏

[编程题]剪纸游戏
  • 热度指数:336 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}小蓝拿着一张 n \times m 的方格纸从中剪下若干不相连的图案;剪裁时只会沿着方格网线裁切,因此不会破坏任何一个完整的小方格。

\hspace{15pt}小灰灰只拿到了剩余的残缺纸张。若用 `'.'` 表示被剪去的小方格,`'*'` 表示仍保留的小方格,则他得到一张由 `'.'` 与 `'*'` 组成的矩阵。由于各个剪下的图案之间互不连通,小灰灰可以根据 `'.'` 的连通块反推出每一个被剪下来的图案。

\hspace{15pt}现在小灰灰想知道:在所有被剪下来的图案中,有多少个是长方形(正方形视为特殊的长方形)。

输入描述:
\hspace{15pt}第一行输入两个整数 n,m\left(1\leqq n,m\leqq 1000\right)——纸张的行数与列数。
\hspace{15pt}接下来 n 行,每行输入一个长度为 m 的由 `'.'` 与 `'*'` 组成的字符串,描述残缺纸张的形状:
\hspace{23pt}\bullet\,`'.'` 代表该方格已被剪去;
\hspace{23pt}\bullet\,`'*'` 代表该方格仍保留。


输出描述:
\hspace{15pt}输出一个整数,表示被剪下来的图案中长方形的数量。
示例1

输入

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

发表于 2025-08-30 10:58:40 回复(0)