Computer >> Máy Tính >  >> Lập trình >> Lập trình

Hình vuông ma thuật


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.

Hình vuông ma thuật

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