游游拿到了一个字符矩阵,她想知道有多少个三角形满足以下条件:
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); } } }