【问题描述】
给定一个字母矩阵,定义一个LQ三角形为某行中连续的几个字母、某列中连续的几个字母和一条45度的斜线中连续的几个字母组成的等腰直角三角形的边缘部分,其中每条边上的字母数量相等且至少为2
。
例如,对于下面的字母矩阵中,所有的字母 L 组成一个LQ三角形,所有字母 Q 组成了一个 LQ 三角形,所有字母 C 也组成了一个 LQ 三角形。
AAAAAAA ALLLLLA ALQQLAA ALQLAAC ALLAACC ALAACCC
如果一个 LQ 三角形边上的所有字母相等,则称为一个全相等三角形。以三个例子都是全相等三角形。
给定一个字母矩阵,请求其中有多少个全相等三角形。
【输入格式】
输入第一行包含两个整数 n, m,分别表示字母矩阵的行数和列数。
接下来 n 行,每行 m 个大写字母,为给定的矩阵。
【输出格式】
输出一行,包含一个整数,表示答案。
【样例输入】
3 4 AAAA ALAQ ALQQ
【样例输出】
4
【样例输入】
6 7 AAAAAAA ALLLLLA ALQQLAA ALQLAAC ALLAACC ALAACCC
【样例输出】
23
题解:枚举
#include <bits/stdc++.h> using namespace std; const int N = 15; int n, m; int
len; int ans = 0; string a[N]; bool check(int i, int j, int di, int dj) { char c
= a[i][j]; for(int k = 0; k < len - 1; k++) { i += di; j += dj; if(i < 0 || i >=
n|| j < 0 || j >= m) return false; if(c != a[i][j]) return false; } return true
; } int main() { cin >> n >> m; for(int i = 0; i < n; i++) { cin >> a[i]; } for(
len= min(n, m); len >= 2; len--) { for(int i = 0; i < n; i++) { for(int j = 0; j
< m; j++) { ans += (check(i, j, 1, 0) && check(i, j, 0, 1) && check(i + len - 1,
j, -1, 1)); ans += (check(i, j, 1, 0) && check(i, j, 0, -1) && check(i + len -
1, j, -1, -1)); ans += (check(i, j, -1, 0) && check(i, j, 0, 1) && check(i - len
+ 1, j, 1, 1)); ans += (check(i, j, -1, 0) && check(i, j, 0, -1) && check(i -
len+ 1, j, 1, -1)); } } } cout << ans << endl; return 0; }