题意:给一个图的大小,给你一个图,求图中 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;
}