思路:题目说了1,2,3,4,5,6,7,8,9,0这个10个盲文都是由3*2的矩阵构成的。
我们可以来模拟一下这10个盲文的表示:
用二进制的方式来表示,哪个位置上有值我们就给它标识为1:
1 2
3 4
5 6
比如说盲文1就是:
1 0
0 0
0 0
盲文2就是:
1 0
1 0
0 0
以此类推
我们在输入的矩阵中枚举3*2的小矩阵,如果发现了 1,2,3,4,6,7,8,9,0矩阵。就统计一下这些矩阵出现的个数。
code
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n, m;
char g[110][110];
map<int, int>cnt;
map<string, int> mp;
void check(int x,int y)
{
//模拟1 2 3 4 5 6 7 8 9 0 十个盲文矩阵
mp["1"] = 1;
mp["13"] = 2;
mp["12"] = 3;
mp["124"] = 4;
mp["14"] = 5;
mp["123"] = 6;
mp["1234"] = 7;
mp["134"] = 8;
mp["23"] = 9;
mp["234"] = 10;
string s;
int val = 0;
//从传过来的每个点向下拓展为3*2的矩阵,查看是1,2,3……10中的哪个矩阵
for (int i = x; i <= x + 2; i++)
{
for (int j = y; j<= y+1; j++)
{
val++;
if (g[i][j] == '*')
{
s += to_string(val);
}
}
}
cnt[mp[s]]++;
}
void sovel()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
cin >> g[i][j];
}
}
int sum = 0;
for (int i = 1; i<=n-2; i++) //不能枚举满列 因为最后一行最后一列不能再向下扩展
{
for (int j = 1; j <=m-1; j++)
{
check(i, j);
}
}
for (int i = 1; i <= 10; i++)
{
cout << cnt[i] << " ";
}
}
signed main()
{
cin.tie(nullptr)->sync_with_stdio(false);
int t = 1;
while (t--)
{
sovel();
}
return 0;
}
这里把l打印出来看看:
每一个块都是一个3*2的矩阵: