Ma trận vuông là một ma trận vuông có thứ tự là số lẻ và trong đó tổng các phần tử của mỗi hàng hoặc mỗi cột hoặc mỗi đường chéo là như nhau.
Tổng của mỗi hàng hoặc mỗi cột hoặc mỗi đường chéo có thể được tìm thấy bằng cách sử dụng công thức này. n (n2 + 1) / 2
Dưới đây là các quy tắc để tạo một hình vuông ma thuật -
- Chúng tôi sẽ bắt đầu từ cột giữa của hàng đầu tiên, của ma trận và luôn chuyển đến góc trên cùng bên trái để đặt số tiếp theo
- Nếu hàng vượt quá hoặc hàng không có trong ma trận, thì hãy thay đổi cột thành cột bên trái và đặt số ở hàng cuối cùng của ma trận và lại chuyển đến góc trên cùng bên trái.
- Nếu cột vượt quá hoặc cột không có trong ma trận, hãy thay đổi hàng thành hàng trên cùng và đặt số ở cột cuối cùng của ma trận đó, sau đó chuyển đến góc trên cùng bên trái một lần nữa.
- Khi góc trên cùng bên trái không bị bỏ trống hoặc cả hàng và cột đều vượt quá phạm vi, thì hãy đặt số ở cuối số được đặt cuối cùng.
Đầu vào và Đầu ra
Input: The order of the matrix 5 Output: 15 8 1 24 17 16 14 7 5 23 22 20 13 6 4 3 21 19 12 10 9 2 25 18 11
Thuật toán
createSquare(mat, r, c)
Đầu vào: Ma trận.
Đầu ra: Hàng và Cột.
Begin count := 1 fill all elements in mat to 0 range := r * c i := 0 j := c/2 mat[i, j] := count //center of top row while count < range, do increase count by 1 if both i and j crosses the matrix range, then increase i by 1 else if only i crosses the matrix range, then i := c – 1 decrease j by 1 else if only j crosses the matrix range, then j := c – 1 decrease i by 1 else if i and j are in the matrix and element in (i, j) ≠ 0, then increase i by 1 else decrease i and j by 1 mat[i, j] := count done display the matrix mat End
Ví dụ
#include<iostream> #include<iomanip> using namespace std; void createSquare(int **array, int r, int c) { int i, j, count = 1, range; for(i = 0; i<r; i++) for(j = 0; j<c; j++) array[i][j] = 0; //initialize all elements with 0 range = r*c; i = 0; j = c/2; array[i][j] = count; while(count < range) { count++; if((i-1) < 0 && (j-1) < 0) //when both row and column crosses the range i++; else if((i-1) <0) { //when only row crosses range, set i to last row, and decrease j i = r-1; j--; }else if((j-1) < 0) { //when only col crosses range, set j to last column, and decrease i j = c-1; i--; }else if(array[i-1][j-1] != 0) //when diagonal element is not empty, go to next row i++; else{ i--; j--; } array[i][j] = count; } // Printing the square for(i = 0; i<r; i++) { for(j = 0; j<c; j++) cout <<setw(3) << array[i][j]; cout << endl; } } main() { int** matrix; int row, col; cout << "Enter the order(odd) of square matrix :"; cin >> row; col = row; matrix = new int*[row]; for(int i = 0; i<row; i++) { matrix[i] = new int[col]; } createSquare(matrix, row, col); }
Đầu ra
Enter the order(odd) of square matrix :5 15 8 1 24 17 16 14 7 5 23 22 20 13 6 4 3 21 19 12 10 9 2 25 18 11