多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 检查二进制矩阵中的水平和垂直对称性 > 原文: [https://www.geeksforgeeks.org/check-horizontal-vertical-symmetry-binary-matrix/](https://www.geeksforgeeks.org/check-horizontal-vertical-symmetry-binary-matrix/) 给定 **N** 行和 **M** 列的二维二进制矩阵。 任务是检查矩阵是水平对称的,垂直对称的还是两者都是。 如果第一行与最后一行相同,第二行与第二最后一行相同,则称矩阵为水平对称。 如果第一列与最后一列相同,第二列与最后一列相同,则称矩阵为垂直对称。 如果矩阵是垂直对称的,则打印“ VERTICAL”;如果矩阵是垂直对称的,则打印“ HORIZONTAL”;如果矩阵是垂直和水平对称的,则打印“ BOTH”;如果不对称,则打印“ NO”。 **示例**: ``` Input : N = 3 M = 3 0 1 0 0 0 0 0 1 0 Output : Both First and third row are same and also second row is in middle. So Horizontal Symmetric. Similarly, First and third column are same and also second column is in middle, so Vertical Symmetric. Input : 0 0 1 1 1 0 0 0 1. Output : Horizontal ``` 想法是使用指向指示两行(或列)的指针,并比较两个指向的行(或列)的每个单元格。 对于水平对称,初始化一个指针 i = 0,另一个指针 j = N –1。 现在,比较第 i 行和第 j 行的每个元素。 在每个循环周期中,将 i 加 1 并将 j 减 1。 如果找到至少一个不相同的元素,则将矩阵标记为非水平对称。 同样,对于“垂直对称”,初始化一个指针 i = 0,另一个指针 j = M –1。 现在,比较第 i 列和第 j 列的每个元素。 在每个循环周期中,将 i 加 1 并将 j 减 1。 如果找到至少一个不相同的元素,则将矩阵标记为非垂直对称。 下面是上述想法的实现: ## C++ ```cpp // 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\n";     else if (horizontal && !vertical)         cout << "HORIZONTAL\n";     else if (vertical && !horizontal)         cout << "VERTICAL\n";     else         cout << "BOTH\n"; } // Driven Program int main() {     int mat[MAX][MAX] = { { 1, 0, 1 },                           { 0, 0, 0 },                           { 1, 0, 1 } };     checkHV(mat, 3, 3);     return 0; } ``` ## Java ```java // Java program to find if // a matrix is symmetric. import java.io.*; public class GFG {     static void checkHV(int[][] arr, int N,                         int M)     {         // Initializing as both horizontal         // and vertical symmetric.         boolean horizontal = true;         boolean 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]) {                     horizontal = false;                     break;                 }             }         }         if (!horizontal && !vertical)             System.out.println("NO");         else if (horizontal && !vertical)             System.out.println("HORIZONTAL");         else if (vertical && !horizontal)             System.out.println("VERTICAL");         else             System.out.println("BOTH");     }     // Driver Code     static public void main(String[] args)     {         int[][] mat = { { 1, 0, 1 },                         { 0, 0, 0 },                         { 1, 0, 1 } };         checkHV(mat, 3, 3);     } } // This code is contributed by vt_m. ``` ## Python3 ```py # Python3 program to find if a matrix is symmetric. MAX = 1000 def checkHV(arr, N, M):     # Initializing as both horizontal and vertical     # symmetric.     horizontal = True     vertical = True     # Checking for Horizontal Symmetry. We compare     # first row with last row, second row with second     # last row and so on.     i = 0     k = N - 1     while(i < N // 2):         # Checking each cell of a column.         for j in range(M):             # check if every cell is identical             if (arr[i][j] != arr[k][j]):                 horizontal = False                 break         i += 1         k -= 1     # Checking for Vertical Symmetry. We compare     # first column with last column, second xolumn     # with second last column and so on.     i = 0     k = M - 1     while(i < M // 2):         # Checking each cell of a row.         for j in range(N):             # check if every cell is identical             if (arr[i][j] != arr[k][j]):                 vertical = False                 break         i += 1         k -= 1     if (not horizontal and not vertical):         print("NO")     elif (horizontal and not vertical):         print("HORIZONTAL")     elif (vertical and not horizontal):         print("VERTICAL")     else:         print("BOTH") # Driver code mat = [[1, 0, 1],[ 0, 0, 0],[1, 0, 1]] checkHV(mat, 3, 3) # This code is contributed by shubhamsingh10 ``` ## C# ```cs // C# program to find if // a matrix is symmetric. using System; public class GFG {     static void checkHV(int[, ] arr, int N,                         int M)     {         // Initializing as both horizontal         // and vertical symmetric.         bool horizontal = true;         bool 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]) {                     horizontal = false;                     break;                 }             }         }         if (!horizontal && !vertical)             Console.WriteLine("NO");         else if (horizontal && !vertical)             Console.WriteLine("HORIZONTAL");         else if (vertical && !horizontal)             Console.WriteLine("VERTICAL");         else             Console.WriteLine("BOTH");     }     // Driver Code     static public void Main()     {         int[, ] mat = { { 1, 0, 1 },                         { 0, 0, 0 },                         { 1, 0, 1 } };         checkHV(mat, 3, 3);     } } // This code is contributed by vt_m. ``` ## PHP ```php <?php // PHP program to find if  // a matrix is symmetric. function checkHV($arr, $N, $M) {     // Initializing as both horizontal      // and vertical symmetric.     $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 ($i = 0, $k = $N - 1;           $i < $N / 2; $i++,           $k--)     {         // Checking each cell of a column.         for ($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 ($i = 0, $k = $M - 1;           $i < $M / 2; $i++,           $k--)     {         // Checking each cell of a row.         for ($j = 0; $j < $N; $j++)         {             // check if every cell is identical             if ($arr[$i][$j] != $arr[$k][$j])             {                 $horizontal = false;                 break;             }         }     }     if (!$horizontal && !$vertical)         echo "NO\n";     else if ($horizontal && !$vertical)         cout << "HORIZONTAL\n";     else if ($vertical && !$horizontal)         echo "VERTICAL\n";     else echo "BOTH\n"; } // Driver Code $mat = array(array (1, 0, 1),              array (0, 0, 0),              array (1, 0, 1)); checkHV($mat, 3, 3); // This code is contributed by nitin mittal.  ?> ``` **输出**: ``` BOTH ``` **时间复杂度**: O(N * M)。 本文由 [**Anuj Chauhan**](https://www.facebook.com/anuj0503) 提供。 如果您喜欢 GeeksforGeeks 并希望做出贡献,则还可以使用 [tribution.geeksforgeeks.org](http://www.contribute.geeksforgeeks.org) 撰写文章,或将您的文章邮寄至 tribution@geeksforgeeks.org。 查看您的文章出现在 GeeksforGeeks 主页上,并帮助其他 Geeks。