游游拿到了一个字符矩阵,她想知道有多少个三角形满足以下条件:
1. 三角形的三个顶点分别是 y、o、u 字符。
2. 三角形为直角三角形,且两个直角边一个为水平、另一个为垂直。
第一行输入两个正整数,用空格隔开,代表矩阵的行数和列数。
接下来的行,每行输入一个长度为
的字符串,代表游游拿到的矩阵。
输出一个整数,代表满足条件的三角形个数。
2 3 you our
3
如下图
DEBUG = False def num_of_trigle(matrix, rows, cols): # 初始化行和列计数器 row_num = [[0, 0, 0] for _ in range(rows)] col_num = [[0, 0, 0] for _ in range(cols)] # 统计每个字符在每一行和每一列中的数量 for i in range(rows): for j in range(cols): char = matrix[i][j] if char == 'y': row_num[i][0] += 1 col_num[j][0] += 1 elif char == 'o': row_num[i][1] += 1 col_num[j][1] += 1 elif char == 'u': row_num[i][2] += 1 col_num[j][2] += 1 # 计算直角三角形的数量 num = 0 for i in range(rows): for j in range(cols): char = matrix[i][j] if char == 'y': row_num_o = row_num[i][1] row_num_u = row_num[i][2] col_num_o = col_num[j][1] col_num_u = col_num[j][2] num += row_num_o * col_num_u + row_num_u * col_num_o elif char == 'o': row_num_y = row_num[i][0] row_num_u = row_num[i][2] col_num_y = col_num[j][0] col_num_u = col_num[j][2] num += row_num_y * col_num_u + row_num_u * col_num_y elif char == 'u': row_num_y = row_num[i][0] row_num_o = row_num[i][1] col_num_y = col_num[j][0] col_num_o = col_num[j][1] num += row_num_y * col_num_o + row_num_o * col_num_y return num n, m = map(int, input().split()) matrix = [] for i in range(n): matrix.append([char for char in input()]) if DEBUG: print(matrix) print(len(matrix), len(matrix[0])) res = num_of_trigle(matrix, n, m) print(res)
# Pypy3 m, n = list(map(int, input().split())) row = [[0] * 3 for _ in range(m)] col = [[0] * 3 for _ in range(n)] valid_start = [] for r in range(m): s = input() for c, x in enumerate(s): if x in 'you': valid_start.append((r, c, x)) if x == 'y': row[r][0] += 1 col[c][0] += 1 elif x == 'o': row[r][1] += 1 col[c][1] += 1 else: row[r][2] += 1 col[c][2] += 1 ans = 0 for r, c, x in valid_start: if x == 'y': ans += row[r][1] * col[c][2] + row[r][2] * col[c][1] elif x == 'o': ans += row[r][0] * col[c][2] + row[r][2] * col[c][0] else: ans += row[r][0] * col[c][1] + row[r][1] * col[c][0] print(ans)
#include <iostream>
#include <vector>
#include <unordered_set>
#include <algorithm>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
long long int sum = 0;
vector<vector<int>> isy(n, vector<int>(m));
vector<vector<int>> iso(n, vector<int>(m));
vector<vector<int>> isu(n, vector<int>(m));
vector<int> cntRowY(n), cntRowO(n), cntRowU(n), cntLieY(m), cntLieO(m), cntLieU(m);
for (int i = 0; i < n; i++)
{
string str;
cin >> str;
for (int j = 0; j < m; j++)
{
if (str[j] == 'y')
{
isy[i][j] = 1;
cntRowY[i] ++;
cntLieY[j] ++;
}
if (str[j] == 'o')
{
iso[i][j] = 1;
cntRowO[i] ++;
cntLieO[j] ++;
}
if (str[j] == 'u')
{
isu[i][j] = 1;
cntRowU[i] ++;
cntLieU[j] ++;
}
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (isy[i][j])
sum += cntRowO[i] * cntLieU[j] + cntRowU[i] * cntLieO[j];
else if (iso[i][j])
sum += cntRowY[i] * cntLieU[j] + cntRowU[i] * cntLieY[j];
else if (isu[i][j])
sum += cntRowO[i] * cntLieY[j] + cntRowY[i] * cntLieO[j];
}
}
cout << sum;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
int n = in.nextInt(), m = in.nextInt();
char[][]grid = new char[n][m];
int[] yRow = new int[n], yCol = new int[m], oRow = new int[n],
oCol = new int[m], uRow = new int[n], uCol = new int[m];
long ans = 0;
for (int i = 0; i < n; i++) {
String s = in.next();
for (int j = 0; j < s.length(); j++) {
grid[i][j] = s.charAt(j);
if (grid[i][j] == 'y') {
yRow[i]++;
yCol[j]++;
}
if (grid[i][j] == 'o') {
oRow[i]++;
oCol[j]++;
}
if (grid[i][j] == 'u') {
uRow[i]++;
uCol[j]++;
}
}
}
// 遍历直角顶点
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] == 'y') {
ans += oRow[i] * uCol[j] + uRow[i] * oCol[j];
}
if (grid[i][j] == 'o') {
ans += yRow[i] * uCol[j] + uRow[i] * yCol[j];
}
if (grid[i][j] == 'u') {
ans += yRow[i] * oCol[j] + oRow[i] * yCol[j];
}
}
}
System.out.println(ans);
}
}
}