测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A18275. L形硬币

填空题 困难

题目描述

L形硬币

题目描述

有一个 n * n 的棋盘,某些格子里有硬币(用 o 表示),其余为空(用 x 表示)。

对于每一个有硬币的格子,我们可以选择同一行中的另一个硬币和同一列中的另一个硬币(均不同于当前格子),这三个格子组成一个“L”形(当前格子为拐角)。

请问一共有多少种不同的这样的三元组?

注意:不同的拐角格子视为不同的三元组;同一行或同一列中选择不同的另一个硬币也视为不同的三元组。

输入格式

第一行一个整数 n。

接下来 n 行,每行一个长度为 n 的字符串,由 o 和 x 组成。

输出格式

输出一个整数,表示满足条件的三元组总数。

输入样例 #1

2
oo
oo

输出样例 #1

4

输入样例 #2

3
ooo
oxx
xxo

输出样例 #2

4

说明提示

2≤n≤2000

参考答案

#include <iostream> #include <string> using namespace std; const int MAXN = 2005; int row[MAXN], col[MAXN]; string grid[MAXN]; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; for(int i = 0; i < n; ++i) { cin >> grid[i]; for(int j = 0; j < n; ++j) { if(grid[i][j] == 'o') { row[i]++; col[j]++; } } } long long ans = 0; // 防止int溢出,2000*2000量级乘积会超int范围 for(int i = 0; i < n; ++i) { for(int j = 0; j < n; ++j) { if(grid[i][j] == 'o') ans += 1LL * (row[i] - 1) * (col[j] - 1); } } cout << ans << '\n'; return 0; }
上一题 下一题