C++程序 检查二进制矩阵的水平和垂直对称性
给定一个由 N 行和 M 列组成的二进制二维矩阵。任务是要检查矩阵是否具有水平对称性、垂直对称性或两者都具备。当第一行与最后一行相同,第二行与倒数第二行相同,依此类推时,该矩阵被认为具有水平对称性。当第一列与最后一列相同,第二列与倒数第二列相同,依此类推时,该矩阵被认为具有垂直对称性。如果矩阵垂直对称,则输出“VERTICAL”,如果矩阵水平对称,则输出“HORIZONTAL”,如果矩阵既具有垂直对称性又具有水平对称性,则输出“BOTH”,如果不对称,则输出“NO”。
举例
输入:N = 3 M = 3
0 1 0
0 0 0
0 1 0
输出:Both
第一行和第三行相同,第二行处于中间。因此具有水平对称性。
类似地,第一列和第三列相同,并且第二列处于中间,因此具有垂直对称性。
输入:
0 0 1
1 1 0
0 0 1.
输出:Both
思路是使用指向两个行(列)的指针,并比较所指向的行(列)的每个单元格。
水平对称: 初始化一个指针i=0,另一个指针j=N-1。
现在,每个循环周期中比较i-th行和j-th行的每个元素。每次将i增加1,j减少1。如果发现至少有一个不相同的元素,则标记矩阵为不具有水平对称性。
类似地,对于垂直对称性,初始化一个指针i=0,另一个指针j=M-1。
现在,比较i-th列和j-th列的每个元素。每次将i增加1,j减少1。如果发现至少有一个不相同的元素,则标记矩阵为不具有垂直对称性。
下面是上述思想的实现:
// C++ program to find if a matrix is symmetric.
#include <bits/stdc++.h>
#define MAX 1000
using namespace std;
void checkHV(int arr[][MAX], int N, int M)
{
// Initializing as both horizontal and vertical
// symmetric.
bool horizontal = true, vertical = true;
// Checking for Horizontal Symmetry. We compare
// first row with last row, second row with second
// last row and so on.
for (int i = 0, k = N - 1; i < N / 2; i++, k--) {
// Checking each cell of a column.
for (int j = 0; j < M; j++) {
// check if every cell is identical
if (arr[i][j] != arr[k][j]) {
horizontal = false;
break;
}
}
}
// Checking for Vertical Symmetry. We compare
// first column with last column, second xolumn
// with second last column and so on.
for (int i = 0, k = M - 1; i < M / 2; i++, k--) {
// Checking each cell of a row.
for (int j = 0; j < N; j++) {
// check if every cell is identical
if (arr[i][j] != arr[k][j]) {
vertical = false;
break;
}
}
}
if (!horizontal && !vertical)
cout << "NO";
else if (horizontal && !vertical)
cout << "HORIZONTAL";
else if (vertical && !horizontal)
cout << "VERTICAL";
else
cout << "BOTH";
}
// Driven Program
int main()
{
int mat[MAX][MAX]
= { { 1, 0, 1 }, { 0, 0, 0 }, { 1, 0, 1 } };
checkHV(mat, 3, 3);
return 0;
}
输出
BOTH
时间复杂度 O(N*M).
辅助空间 : O(1),因为它对变量使用了常量空间。