问题描述
给定一个字母矩阵,定义一个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
评测用例规模与约定
对于 50% 的评测用例,1 <= n, m <= 10。 对于所有评测用例,1 <= n, m <= 100。
=========================================================================
import java.util.Scanner;
public class Main1 {
private static int n, m;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
char[][] cs = new char[n][m];
for (int i = 0; i < n; i++) {
cs[i] = sc.next().toCharArray();
}
int cnt = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cnt += dfs(cs, i, j);
}
}
System.out.println(cnt);
}
private static int dfs(char[][] cs, int x, int y) {
char cur = cs[x][y];
int ans = 0;
// 右下角
int len = 2;
while (true) {
boolean is = true;
int X = x + len - 1, Y = y + len - 1;
// 求两个横向的 如果不满足不需要继续循环
if (X >= n || Y >= m || cs[X][y] != cur || cs[x][Y] != cur) break;
// 看当前三角形是否符合
for (int i = 1; i < len - 1; i++) {
if (cs[x + i][Y - i] != cur) {
is = false;
break;
}
}
len++;
if (is) ans++;
}
// 右上角
len = 2;
while (true) {
boolean is = true;
int X = x - len + 1, Y = y + len - 1;
if (X < 0 || Y >= m || cs[X][y] != cur || cs[x][Y] != cur) break;
for (int i = 1; i < len - 1; i++) {
if (cs[x - i][Y - i] != cur) {
is = false;
break;
}
}
len++;
if (is) ans++;
}
// 左上角
len = 2;
while (true) {
boolean is = true;
int X = x - len + 1, Y = y - len + 1;
if (X < 0 || Y < 0 || cs[X][y] != cur || cs[x][Y] != cur) break;
for (int i = 1; i < len - 1; i++) {
if (cs[x - i][Y + i] != cur) {
is = false;
break;
}
}
len++;
if (is) ans++;
}
// 左下角
len = 2;
while (true) {
boolean is = true;
int X = x + len - 1, Y = y - len + 1;
if (X >= n || Y < 0 || cs[X][y] != cur || cs[x][Y] != cur) break;
for (int i = 1; i < len - 1; i++) {
if (cs[x + i][Y + i] != cur) {
is = false;
break;
}
}
len++;
if (is) ans++;
}
return ans;
}
}