M - BpbBppbpBB (VJ)(B与b的数量统计)

 传送门

题意:给一个图的大小,给你一个图,求图中 B 和 b 的数量

思路:仔细思考,可发现,B中间有两个大白格, 小b只有一个,而且B的黑格数量与小b的不同。我们假设 B 有 x 个, b 有 y 个,那么:

2 * x + y = 大白格的总数,B的小黑格 * x + b的小黑格 * y = 小黑格的总数;

解方程即可

代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
#define int long long
typedef pair<int, int>PII;
int n, m, k;
int T;
char g[1010][1010];
string s[10], c[10];

void build()     //大白格
{
    c[0] = "######";
    c[1] = "##..##";
    c[2] = "#....#";
    c[3] = "#....#";
    c[4] = "##..##";
    c[5] = "######";
}

bool check(int x, int y)
{
    int cnt = 0;
    for(int i = 1+x; i <= 6+x; i ++)
    {
        s[cnt] = "";
        for(int j = 1+y; j <= 6+y; j ++)
        {
            s[cnt]+=g[i][j];
        }
        if(s[cnt]!=c[cnt]) return 0;
        cnt++;
    }
    return 1;
}

signed main()
{
    ios::sync_with_stdio(false), cin.tie(0);
    cin >> n >> m;
    int hei = 0;
    for(int i = 1; i <= n; i ++)
    {
        for(int j = 1; j <= m; j ++)
        {
            cin >> g[i][j];
            if(g[i][j]=='#') hei++;    //黑方格的总数
        }
    }
    build();
    int bai = 0;
    for(int i = 1; i <= n; i ++)
    {
        for(int j = 1; j <= m; j ++)
        {
            if(g[i][j]=='#')         //纯暴力,遇到黑格直接向右和向下搜6*6的方格,判断是不是大白格。
            {
                if(check(i-1, j-1)) bai++; //大白格的数量
            }
        }
    }
    int x, y;
    int a = 146, b = 100;    //分别是一个B的黑方格数量和一个b的黑方格数量
    x = (bai*b-hei)/(2*b-a);//由ax + by = hei 和 2a + b = bai两个方程解得
    y = bai - 2*x;          //x带回原方程得y
    cout << x << " " << y;
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值