2024年春节PAT乙级考试 B-4 盲文识别 题型:模拟

165 阅读1分钟

f2d3c7af2b85db412bc7deb25d03385.png

思路:题目说了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的矩阵: image.png