נתון מטריצה בינארית דו מימדית של נ שורות ו מ עמודות. המשימה היא לבדוק האם המטריצה היא סימטרית אנכית סימטרית אופקית או שניהם. אומרים שהמטריקס היא סימטרית אופקית אם השורה הראשונה זהה לשורה האחרונה השורה השנייה זהה לשורה השנייה האחרונה וכן הלאה. ונאמר שהמטריקס היא סימטרית אנכית אם העמודה הראשונה זהה לעמודה האחרונה העמודה השנייה זהה לעמודה השנייה האחרונה וכן הלאה.
הדפס ' אֲנָכִי 'אם המטריצה סימטרית אנכית' אופקי 'אם המטריצה סימטרית אנכית' שְׁנֵיהֶם ' אם המטריצה היא סימטרית אנכית ואופקית ו' לֹא אם לא סימטרי.
דוגמאות:
קֶלֶט: N = 3 M = 3
0 1 0
0 0 0
0 1 0
תְפוּקָה: שְׁנֵיהֶם
הֶסבֵּר: השורה הראשונה והשלישית זהות וגם השורה השנייה נמצאת באמצע. אז סימטרי אופקי. באופן דומה העמודה הראשונה והשלישית זהות וגם העמודה השנייה נמצאת באמצע כך שהיא סימטרית אנכית.קֶלֶט: N = 3 M = 3
0 0 1
1 1 0
0 0 1
תְפוּקָה: שְׁנֵיהֶם
גִישָׁה: הרעיון הוא להשתמש במצביעים המציינים שתי שורות (או עמודות) ולהשוות כל תא של שתי השורות (או העמודות) המחודדות.
- עבור סימטריה אופקית אתחול מצביע אחד i = 0 ומצביע אחר j = N - 1.
- כעת השווה כל רכיב בשורה ה-י' והשורה ה-j'. הגדל את i ב-1 והקטין את j ב-1 בכל מחזור לולאה.
- אם לפחות אחד לא נמצא אלמנט זהה סמן את המטריצה כלא סימטרית אופקית.
- באופן דומה עבור סימטריה אנכית אתחול מצביע אחד i = 0 ומצביע אחר j = M - 1.
- כעת השווה כל רכיב של העמודה ה-i והעמודה ה-j'. הגדל את i ב-1 והקטין את j ב-1 בכל מחזור לולאה.
- אם לפחות אחד לא נמצא אלמנט זהה סמן את המטריצה כלא סימטרית אנכית.
להלן יישום הרעיון לעיל:
C++// C++ program to find if a matrix is symmetric. #include #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 column // with second last column and so on. for (int j = 0 k = M - 1; j < M / 2; j++ k--) { // Checking each cell of a row. for (int i = 0; i < N; i++) { // check if every cell is identical if (arr[i][j] != arr[i][k]) { vertical = false; break; } } } if (!horizontal && !vertical) cout << 'NOn'; else if (horizontal && !vertical) cout << 'HORIZONTALn'; else if (vertical && !horizontal) cout << 'VERTICALn'; else cout << 'BOTHn'; } // Driven Program int main() { int mat[MAX][MAX] = { { 0 1 0 } { 0 0 0 } { 0 1 0 } }; checkHV(mat 3 3); return 0; }
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 column // with second last column and so on. for (int j = 0 k = M - 1; j < M / 2; j++ k--) { // Checking each cell of a row. for (int i = 0; i < N; i++) { // check if every cell is identical if (arr[i][j] != arr[i][k]) { 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 # 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 column # with second last column and so on. i = 0 k = M - 1 while(j < M // 2): # Checking each cell of a row. for i in range(N): # check if every cell is identical if (arr[i][j] != arr[i][k]): vertical = False break j += 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# // 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 j = 0 k = N - 1; j < N / 2; j++ k--) { // Checking each cell of a column. for (int i = 0; i < M; i++) { // check if every cell is identical if (arr[i j] != arr[i k]) { horizontal = false; break; } } } // Checking for Vertical Symmetry. We compare // first column with last column second column // 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 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 column with // second last column and so on. for ($j = 0 $k = $M - 1; $j < $M / 2; $j++ $k--) { // Checking each cell of a row. for ($i = 0; $i < $N; $i++) { // check if every cell is identical if ($arr[$i][$j] != $arr[$i][$k]) { $horizontal = false; break; } } } if (!$horizontal && !$vertical) echo 'NOn'; else if ($horizontal && !$vertical) cout << 'HORIZONTALn'; else if ($vertical && !$horizontal) echo 'VERTICALn'; else echo 'BOTHn'; } // 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. ?> JavaScript <script> // Javascript program to find if // a matrix is symmetric. function checkHV(arr N M) { // Initializing as both horizontal // and vertical symmetric. let horizontal = true; let vertical = true; // Checking for Horizontal Symmetry. // We compare first row with last // row second row with second // last row and so on. for (let i = 0 k = N - 1; i < parseInt(N / 2 10); i++ k--) { // Checking each cell of a column. for (let 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 column // with second last column and so on. for (let j = 0 k = M - 1; j < parseInt(M / 2 10); j++ k--) { // Checking each cell of a row. for (let i = 0; i < N; i++) { // check if every cell is identical if (arr[i][j] != arr[i][k]) { horizontal = false; break; } } } if (!horizontal && !vertical) document.write('NO'); else if (horizontal && !vertical) document.write('HORIZONTAL'); else if (vertical && !horizontal) document.write('VERTICAL'); else document.write('BOTH'); } let mat = [ [ 1 0 1 ] [ 0 0 0 ] [ 1 0 1 ] ]; checkHV(mat 3 3); </script>
תְפוּקָה
BOTH
מורכבות זמן: O(N*M).
מרחב עזר: O(1)