HJ157 剪纸游戏

  • 题目
  • 题解(13)
  • 讨论(9)
  • 排行

简单 通过率:51.97% 时间限制:3秒 空间限制:256M

知识点广度优先搜索(BFS)

校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。

描述

小蓝拿着一张 n×mn×m 的方格纸从中剪下若干不相连 的图案;剪裁时只会沿着方格网线裁切,因此不会破坏任何一个完整的小方格。

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

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

输入描述:

第一行输入两个整数 n,m(1≦n,m≦1000)n,m(1≦n,m≦1000)------纸张的行数与列数。

接下来 nn 行,每行输入一个长度为 mm 的由 `'.'` 与 `'*'` 组成的字符串,描述残缺纸张的形状:

∙ ∙`'.'` 代表该方格已被剪去;

∙ ∙`'*'` 代表该方格仍保留。

输出描述:

输出一个整数,表示被剪下来的图案中长方形的数量。

示例1

输入:

复制代码
4 10
*.*.*...**
...***.*..
.**..*.*..
*..*****..

复制输出:

复制代码
4

复制说明:

复制代码

可以看出,图中恰有一个正方形,三个长方形,共计四个长方形。

cpp 复制代码
#include<bits/stdc++.h>
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

using namespace std;

int add(int x, int y){return x ? add((x & y) << 1, x ^ y): y;}

#define ONLINE_JUDGE

typedef pair<int,int> PII;
const int N=1010;
int n,m;
char mp[N][N];
int a[N][N];
int dir[][2]={{1,0},{-1,0},{0,-1},{0,1}};

int bfs(int x,int y)
{
    queue<PII> q;
    q.push({x,y});
    int x1=INT_MAX,x2=0,y1=INT_MAX,y2=0;
    x1=min(x1,x);
    x2=max(x2,x);
    y1=min(y1,y);
    y2=max(y2,y);
    while(!q.empty())
    {
        int dx=q.front().first;
        int dy=q.front().second;
        q.pop();
        for(int i=0;i<4;i++)
        {
            int ex=dx+dir[i][0];
            int ey=dy+dir[i][1];
            if(ex<1||ex>n||ey<1||ey>m||mp[ex][ey]=='*'||mp[ex][ey]=='-')
            {
                continue;
            }
            x1=min(x1,ex);
            x2=max(x2,ex);
            y1=min(y1,ey);
            y2=max(y2,ey);
            mp[ex][ey]='-';
            q.push({ex,ey});
        }
    }
    for(int i=x1;i<=x2;i++)
    {
        for(int j=y1;j<=y2;j++)
        {
            if(mp[i][j]=='*')
            {
                return 0;
            }
        }
    }
    return 1;
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("1.in", "r", stdin);
    freopen("1.out", "w", stdout);
#endif
    ios;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>mp[i][j];
        }
    }
    int sum=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(mp[i][j]=='.')
            {
                sum+=bfs(i,j);
            }
        }
    }
    cout<<sum<<"\n";
    return 0;
}
相关推荐
AI机器学习算法12 小时前
机器学习基础知识
数据结构·人工智能·python·深度学习·算法·机器学习·ai学习路线
X journey18 小时前
机器学习进阶(13):支持向量机SVM
算法·机器学习·支持向量机
洛水水18 小时前
【力扣100题】30.二叉树的直径
算法·leetcode·职场和发展
REDcker18 小时前
C++变量存储与ELF段布局详解 从const全局到rodata与nm_readelf验证实践
java·c++·面试
gihigo199819 小时前
Bezier曲线曲面生成算法
算法
平行侠20 小时前
024多精度大整数 - 突破硬件精度限制的任意精度运算
数据结构·算法
IronMurphy20 小时前
【算法四十五】139. 单词拆分
算法
王老师青少年编程21 小时前
csp信奥赛C++高频考点专项训练之字符串 --【字符串排序】:合并序列
c++·字符串·csp·高频考点·信奥赛·字符串排序·合并序列
洛水水21 小时前
【力扣100题】32.将有序数组转换为二叉搜索树
数据结构·算法·leetcode
handler0121 小时前
UDP协议与网络通信知识点
c语言·网络·c++·笔记·网络协议·udp