week3-[二維數組]小方塊
題目描述
如果四個數 a,b,c,da,b,c,da,b,c,d 可以分成兩組,每組兩個數,滿足每組里面的兩個數一樣,那么稱這四個數是好的。
比如,2,5,2,52,5,2,52,5,2,5 是好的,因它滿足兩組:222 與 222 兩個數一樣,555 與 555 兩個數一樣。
給定一個 nnn 行 mmm 列的二維數組 ai,ja_{i,j}ai,j?,有多少對 x,yx,yx,y 滿足 ax,y,ax+1,y,ax,y+1,ax+1,y+1a_{x,y}, a_{x+1,y}, a_{x,y+1}, a_{x+1,y+1}ax,y?,ax+1,y?,ax,y+1?,ax+1,y+1? 是好的?
輸入格式
輸入共 n+1n + 1n+1 行。
第 111 行 222 個正整數 n,mn,mn,m。
接下來 nnn 行,每行 mmm 個用空格隔開的正整數 ai,ja_{i,j}ai,j?。
輸出格式
輸出共 111 行 111 個整數表示答案。
樣例 #1
樣例輸入 #1
2 4
1 2 3 2
2 3 2 3
樣例輸出 #1
2
提示
樣例解釋 111
x=1,y=1x = 1, y = 1x=1,y=1:四個數分別為 1,2,2,31,2,2,31,2,2,3,不是好的。
x=1,y=2x = 1, y = 2x=1,y=2:四個數分別為 2,3,3,22,3,3,22,3,3,2,是好的。
x=1,y=3x = 1, y = 3x=1,y=3:四個數分別為 3,2,2,33,2,2,33,2,2,3,是好的。
不能有 x=2x = 2x=2 或者 y=4y = 4y=4,因為這樣的話就沒有四個數了。
數據范圍
對于所有數據,1≤n,m,ai,j≤1001\leq n,m,a_{i,j}\leq 1001≤n,m,ai,j?≤100。
這題是典型的 2×2 小方塊匹配問題。核心是判斷 四個數是否能分成兩組,每組兩個數相等。
🔎 分析
1?? 判斷“好”的條件
設四個數為 a,b,c,da, b, c, da,b,c,d,它們是“好”的有幾種可能:
- 兩兩相等:
(a == b && c == d)
(a == c && b == d)
(a == d && b == c)
如果滿足其中任意一種,就是好的。
注意順序不重要,四個數中每組兩個相等即可。
2?? 枚舉所有 2×2 方塊
- 遍歷
i = 0..n-2
- 遍歷
j = 0..m-2
- 四個數:
a[i][j], a[i+1][j], a[i][j+1], a[i+1][j+1]
- 判斷是否好 → 累加計數
🖥? C++ 實現
#include <bits/stdc++.h>
using namespace std;int main() {int n,m;cin >> n >> m;vector<vector<int>> a(n, vector<int>(m));for(int i=0;i<n;i++)for(int j=0;j<m;j++)cin >> a[i][j];int cnt = 0;for(int i=0;i<n-1;i++){for(int j=0;j<m-1;j++){int x1 = a[i][j], x2 = a[i+1][j], x3 = a[i][j+1], x4 = a[i+1][j+1];if ((x1==x2 && x3==x4) ||(x1==x3 && x2==x4) ||(x1==x4 && x2==x3)) {cnt++;}}}cout << cnt << endl;return 0;
}