链接:httpsacnowcodercomacmcontest62033D来源:牛客网游游有一个2行�n列的矩阵她想知道有多少个2∗22∗2的子矩阵中4个元素恰好有2种不同的元素?请注意由于子矩阵可能过大因此按如下的形式给出:第一行共有�m个连续段连续相同元素则用一些二元组�1�1�2�2����u 1 c 1 u 2 c 2 u m c m 来表示:第一行首先是有�1c 1 个�1
题目要求求解在给定的矩阵中,有多少个2x2的子矩阵中,恰好有两种不同的元素。
首先,我们需要将题目给出的矩阵转化为一个二维矩阵,方便后续操作。假设给定的矩阵的行数为n,列数为m。我们可以用一个二维数组matrix[n][m]来表示矩阵中的元素。
然后,我们可以通过遍历所有的2x2子矩阵,判断其中的4个元素是否有两种不同的元素。具体思路如下:
- 使用两重循环遍历矩阵中的每一个元素,假设当前元素的坐标为(i, j)。
- 对于每一个元素(matrix[i][j]),我们可以取其右边、下方和右下方的元素作为2x2子矩阵的其他三个元素。
- 判断这四个元素是否有两种不同的值。如果有两种不同的值,说明这个2x2子矩阵满足题目要求,计数器count加一。
- 最后输出计数器count的值,即为满足条件的2x2子矩阵的个数。
下面是具体的代码实现:
#include <iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m; // 输入矩阵的行数和列数
int matrix[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> matrix[i][j]; // 输入矩阵中的元素
}
}
int count = 0; // 计数器,记录满足条件的子矩阵个数
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < m - 1; j++) {
int val1 = matrix[i][j];
int val2 = matrix[i][j+1];
int val3 = matrix[i+1][j];
int val4 = matrix[i+1][j+1];
// 判断这四个元素是否有两种不同的值
if ((val1 != val2 && val1 != val3 && val1 != val4 && val2 != val3 && val2 != val4 && val3 != val4) ||
(val1 == val2 && val1 == val3 && val1 != val4) ||
(val1 == val2 && val1 != val3 && val1 == val4) ||
(val1 != val2 && val1 == val3 && val1 == val4) ||
(val2 == val3 && val2 == val4 && val2 != val1) ||
(val2 == val3 && val2 != val4 && val2 == val1) ||
(val2 != val3 && val2 == val4 && val2 == val1) ||
(val3 == val4 && val3 != val1 && val3 == val2) ||
(val3 != val4 && val3 == val1 && val3 == val2) ||
(val4 != val3 && val4 == val1 && val4 == val2)) {
count++;
}
}
}
cout << count << endl; // 输出满足条件的子矩阵个数
return 0;
}
时间复杂度分析: 遍历矩阵中的每一个元素,时间复杂度为O(n * m)。 总体时间复杂度为O(n * m)
原文地址: https://www.cveoy.top/t/topic/ioo1 著作权归作者所有。请勿转载和采集!