题目描述
Ljc在一个大小为 n×mn \times mn×m 的画板上画了一幅字符画,画的内容由以下三种字符组成(左边的字符为字符 1,中间的为字符 2,右边的为字符 3);
Ljc不会将字符旋转或者镜像,也就是说当某个字符出现时,只会是以上图片中的形式;
Ljc是一个严谨的人,他不会在一个格子里画两次,所以任意两个字符不相交;
Ljc喜欢黑色,所以所有的字符都是黑色的;
那么画中字符 1,字符 2 以及字符 3 的个数分别有多少个呢?
输入描述:
第一行包含两个整数 n,m (5≤n≤500,3≤m≤500)n,m\ (5 \leq n \leq 500, 3 \leq m \leq 500)n,m (5≤n≤500,3≤m≤500);
接下来 nnn 行每行有 mmm 个字符,'.' 表示空白格子,'#' 表示画上去的黑色格子。
输出描述:
输出三个整数,分别代表字符 1,字符 2 以及字符 3 的个数。
示例1
输入
5 11 ###.###.### #.#...#.#.# ###..##.### #.....#.#.# #.....#.###
输出
1 1 1
示例2
输入
10 8 ....###. ..###.#. ###.###. #.###.#. ###.#.#. ######## ##.#.#.# .###.### .#...#.# .#...###
输出
2 2 1
说明
思路:
当搜索到#的时候开始判断
当前这四个点任意一个为空,或者这两个点一个是空一个是# ,那么这个字符一定是F,
只要这三个绿点任意一个是空就能保证是P,剩下的情况就全是B,可以多举几个例子去试试,然后找到之后就把这个字母的位置全部清空.
#include <iostream>
using namespace std;
const int N = 510;
int n, m;
char nums[N][N];
int resp, resf, resm;
void standchangeP(int x, int y) {
nums[x][y] = '.';
nums[x][y + 1] = '.';
nums[x][y + 2] = '.';
nums[x + 1][y + 2] = '.';
nums[x + 2][y + 2] = '.';
nums[x + 2][y + 1] = '.';
nums[x + 2][y + 1] = '.';
nums[x + 1][y] = '.';
nums[x + 2][y] = '.';
nums[x + 3][y] = '.';
nums[x + 4][y] = '.';
}
void standchangeF(int x, int y) {
nums[x][y] = '.';
nums[x][y + 1] = '.';
nums[x][y + 2] = '.';
nums[x + 1][y + 2] = '.';
nums[x + 2][y + 2] = '.';
nums[x + 2][y + 1] = '.';
nums[x + 3][y + 2] = '.';
nums[x + 4][y + 2] = '.';
}
void standchangeM(int x, int y) {
nums[x][y] = '.';
nums[x][y + 1] = '.';
nums[x][y + 2] = '.';
nums[x + 1][y + 2] = '.';
nums[x + 2][y + 2] = '.';
nums[x + 3][y + 2] = '.';
nums[x + 4][y + 2] = '.';
nums[x + 4][y + 1] = '.';
nums[x + 2][y + 1] = '.';
nums[x + 2][y + 1] = '.';
nums[x + 1][y] = '.';
nums[x + 2][y] = '.';
nums[x + 3][y] = '.';
nums[x + 4][y] = '.';
}
int main () {
cin >> n >> m;
getchar();
for (int i = 0; i < n; i ++ ) {
for (int j = 0; j < m; j ++ ) {
nums[i][j] = getchar();
}
getchar();
}
for (int i = 0; i < n; i ++ )
for (int j = 0; j < m; j ++ ) {
// f
if (nums[i][j] == '#') {
if (nums[i + 1][j] == '.' || nums[i + 2][j] == '.'
|| nums[i + 3][j] == '.' || nums[i + 4][j] == '.'
|| (nums[i + 1][j - 1] == '#' && nums[i + 2][j - 1] == '.')) {
standchangeF(i, j);
resf ++;
}
// p
else if (nums[i + 3][j + 2] == '.' || nums[i + 4][j + 2] == '.'
|| nums[i + 4][j + 1] == '.') {
standchangeP(i, j);
resp ++;
}
// b
else {
standchangeM(i, j);
resm ++ ;
}
}
}
cout << resp << ' ' << resf << ' ' << resm;
}
标签:字符,第十八届,nums,广州大学,Ljc,++,ACM,int,500
From: https://blog.csdn.net/chq66666/article/details/137002460