tuan_anhbm
Thành viên thường trực




- Tham gia
- 16/7/09
- Bài viết
- 253
- Được thích
- 1,605









Ma phương cấp 5 thì điền số từ 1-25 thôi chứ bạn ơi!
27|53|19|45|11|
13|29|55|21|37|
39|15|31|47|23|
25|41|7|33|49|
51|17|43|9|35|

Tôi thấy người ta thường định nghĩa Ma Phương cấp N là 1 ma trận 2 chiều gồm N cột và N dòng, với mỗi phần tử của ma trận chứa 1 số nguyên tương ứng từ 1 tới N bình phương và không trùng nhau thỏa mãn tổng tất cả các cột, hàng và các đường chéo đều bằng nhau.Bạn định nghĩa ma phương là gì?
Tôi nói ma phương là hình vuông chứa số, và có tất cả các tổng các số theo hàng ngang, cột dọc, và 2 đường chéo bằng nhau.
Điền từ 1 đến 25 tôi làm có 30 giây thôi. Điền số khác mà đạt yêu cầu mới khó chứ.




Ma phương mà bạn nói là những dạng biến tấu của ma phương cơ bản, tất nhiên là khó hơn rồiBạn định nghĩa ma phương là gì?
Tôi nói ma phương là hình vuông chứa số, và có tất cả các tổng các số theo hàng ngang, cột dọc, và 2 đường chéo bằng nhau.
Điền từ 1 đến 25 tôi làm có 30 giây thôi. Điền số khác mà đạt yêu cầu mới khó chứ.



Từ 5 đến 29 cũng được anh à, số bắt đầu từ bao nhiêu cũng được, và các số tăng dần theo cấp số cộng ví dụ có thể là 2, 4, 6, 8, .....Muốn từ 1 đến 25 càng dễ thôi.
Từ 5 đến 29 cũng được anh à, số bắt đầu từ bao nhiêu cũng được, và các số tăng dần theo cấp số cộng ví dụ có thể là 2, 4, 6, 8, .....



Có mấy qui luật để điền số hở anh?Đó là Ma phương bài 6:
Có mấy qui luật để điền số hở anh?
em thấy qui luật đường đi của anh khác em
Cảm ơn anh vì đã biết thêm 1 qui luật nữa



- Ngoài ra em thấy vị trí trí xuất phát của anh khác em -> vậy có nhiều điểm xuất phát ?? -> có thêm nhiều ma phương khác nữa??Vế lý thuyêt 1 ma phương cơ bản (từ 1 đến n bình phương),
1. xoay 90 độ 3 lần sẽ cho 3 ma phương khác là 4 ma phương.
2. Lật đối xứng qua 4 trục đối xứng của hình vuông, sẽ ra 4 ma phương khác nữa
Vậy theo lý thuyết, sẽ có 16 ma phương.
Riêng ma phương 3 x 3, Phương án xoay (1), cho tới 8 kết quả vì có thể chỉ cần xoay 45 độ.
Em hỏi ngoài lề 1 chút: Cái MA PHƯƠNG này dùng làm gì trong THỰC TẾ vậy sư phụ?Cách tạo ma phương mà mình học từ lớp 5 là thế này:
Chả có ứng dụng gì sất. Nó chỉ là nghiên kíu của mấy tay rảnh rỗi hồi mấy thế kỷ trước lận. (Vì vậy mới để nguyên trong box thư giãn).Em hỏi ngoài lề 1 chút: Cái MA PHƯƠNG này dùng làm gì trong THỰC TẾ vậy sư phụ?
Có ứng dụng thì mới "hứng thú" nghiên cứu




Cách tạo ma phương mà mình học từ lớp 5 là thế này:
- Viết các số thứ tự theo đường chéo
- dời các số nằm ngoài vào trong theo hướng mũi tên
![]()
Rõ ràng là sau khi xoay, hoặc lật, vị trí bắt đầu sẽ thay đổi.
Đang viết code để tạo ma phương có bậc lẻ bất kỳ.
Nguyên văn bởi ndu96081631![]()
![]()
Em hỏi ngoài lề 1 chút: Cái MA PHƯƠNG này dùng làm gì trong THỰC TẾ vậy sư phụ?
Có ứng dụng thì mới "hứng thú" nghiên cứu
Chả có ứng dụng gì sất. Nó chỉ là nghiên kíu của mấy tay rảnh rỗi hồi mấy thế kỷ trước lận. (Vì vậy mới để nguyên trong box thư giãn).
Còn mình thì muốn tìm 1 giải thuật cho bất kỳ 1 bài toán nào, nếu có khả năng. Vận động đầu óc thì mai mốt già đỡ bị ai zơ me.
Ẹc... Ẹc... sư phụ ơi,trên GPE này còn cả mấy trăm bài Excel chưa giải... cho sư phụ tha hồ vận động đầu ócCòn mình thì muốn tìm 1 giải thuật cho bất kỳ 1 bài toán nào, nếu có khả năng. Vận động đầu óc thì mai mốt già đỡ bị ai zơ me.
Toán học là món mà tôi "mặn" nhất, nhưng ý tôi nói là ỨNG DỤNG THỰC TẾ cơ... để "chơi" thì nói làm gì (chẳng trách gì sư phụ cho nó vào box THƯ GIÃN)Ứng dụng đầy ra đấy các bác ạh, nếu không toán học "chết" lâu rồi; các bác xem có nơi nào là không cần đến toán học? Kinh tế, Văn hoá, chính trị, xây dựng, hàng không, vũ trụ,.... chỉ có mình là không ứng dụng tới thôi, hihi!

Cái này thì lại là phát triển cực kỳ đơn giản của ma phương mà bác. Bác điền từ 5-29 thì cũng như điền từ 1-25 rồi cộng thêm 4 vào mỗi ô mà. Còn 2,4,6,8,.. thì là nhân 2 với mỗi ô của ma phương thôi.Từ 5 đến 29 cũng được anh à, số bắt đầu từ bao nhiêu cũng được, và các số tăng dần theo cấp số cộng ví dụ có thể là 2, 4, 6, 8, .....

Sub MaPhuong(N As Integer)
Dim arr() As Integer
ReDim arr(0 To N - 1, 0 To N - 1)
Dim iValue As Integer
Dim iRow As Integer
Dim iCol As Integer
iRow = 0
iCol = N \ 2
For iValue = 1 To N ^ 2
arr(iRow, iCol) = iValue
If (arr((iRow - 1 + N) Mod N, (iCol + 1) Mod N) = 0) Then
iRow = (iRow - 1 + N) Mod N
iCol = (iCol + 1) Mod N
Else
iRow = (iRow + 1) Mod N
End If
Next
Range("A1").Resize(N, N) = arr
End Sub
Khi tôi gán N = 4 thì các chiều ngang không bằng nhau. Bạn test lại thử.Ma phương bậc lẻ thì thuật toán tương đối đơn giản và dễ nhớ, có thể đặt bút để điền luôn vào đc. Tôi mô phỏng thử thuật toán để đưa lên worksheet của excel như sau
Mã:Sub MaPhuong(N As Integer) Dim arr() As Integer ReDim arr(0 To N - 1, 0 To N - 1) Dim iValue As Integer Dim iRow As Integer Dim iCol As Integer iRow = 0 iCol = N \ 2 For iValue = 1 To N ^ 2 arr(iRow, iCol) = iValue If (arr((iRow - 1 + N) Mod N, (iCol + 1) Mod N) = 0) Then iRow = (iRow - 1 + N) Mod N iCol = (iCol + 1) Mod N Else iRow = (iRow + 1) Mod N End If Next Range("A1").Resize(N, N) = arr End Sub

Đây là thuật toán cho ma phương bậc lẻ mà bác, ma phương bậc chẵn thì không đơn giản như vậy đâu.Khi tôi gán N = 4 thì các chiều ngang không bằng nhau. Bạn test lại thử.
Option Explicit
Dim n As Long
Sub MaPhuongLe()
n = WorksheetFunction.Max([A1] + [A1] Mod 2 - 1, 3)
Cells.ClearContents
[A1] = n
[A3] = -n \ 2 - 1
[B3] = n * (n \ 2)
[C1] = -n \ 2 + 1
[C2] = n * (n \ 2 + 1) + 1
[C3] = "=A3+$A$1+1"
[C3].Copy Destination:=Range([C3], Cells(3, 2 + n))
[C3] = "=C1+$A$1-1"
[C3].Copy Destination:=Range([C3], Cells(2 + n, 3))
[D4] = "=MOD(C3+$A$1-1,$A$1*$A$1)+1"
[D4].Copy Destination:=Range([D4], Cells(2 + n, 2 + n))
Range([C3], Cells(2 + n, 2 + n)).Copy
[C3].PasteSpecial Paste:=xlPasteValues
[C1].ClearContents
[C2].ClearContents
[A3].ClearContents
[B3].ClearContents
End Sub
Sub MaPhuong()
N = WorksheetFunction.Max([A1] + [A1] Mod 2 - 1, 3)
Cells.ClearContents
[A1] = N
ReDim arr(0 To N - 1, 0 To N - 1)
arr(0, 0) = N - N \ 2
arr(0, 1) = N * (N \ 2) + N + 1
arr(1, 0) = N * (N \ 2 + 2)
For j = 2 To N - 1
arr(0, j) = arr(0, j - 2) + N + 1
Next j
For i = 2 To N - 1
arr(i, 0) = arr(i - 2, 0) + N - 1
Next i
For i = 1 To N - 1
For j = 1 To N - 1
arr(i, j) = (arr(i - 1, j - 1) - 1 + N) Mod N ^ 2 + 1
Next j, i
[C3].Resize(N, N) = arr
[C3].Resize(N, N).Select
End Sub





Sub MaPhuong(N As Integer)
Const PntMir = "P"
Const VerMir = "V"
Const HorMir = "H"
Const IgnMir = "I"
Dim iRow As Integer
Dim iCol As Integer
Dim arr() As Integer
ReDim arr(1 To N, 1 To N)
For iRow = 1 To N
For iCol = 1 To N
arr(iRow, iCol) = (iRow - 1) * N + iCol
Next
Next
Dim iRowProc As Integer
iRowProc = N \ 2
Dim sKey As String
sKey = String(iRowProc \ 2, PntMir) & IIf(iRowProc Mod 2 = 1, VerMir & HorMir, "")
sKey = sKey & String(iRowProc - Len(sKey), IgnMir)
For iRow = 1 To iRowProc
For iCol = 1 To iRowProc
Select Case Mid(sKey, iCol, 1)
Case PntMir:
Swap arr(iRow, iCol), arr(N - iRow + 1, N - iCol + 1)
Swap arr(iRow, N - iCol + 1), arr(N - iRow + 1, iCol)
Case VerMir:
Swap arr(iRow, iCol), arr(N - iRow + 1, iCol)
Case HorMir:
Swap arr(iRow, iCol), arr(iRow, N - iCol + 1)
End Select
Next
sKey = Right(sKey, 1) & Left(sKey, Len(sKey) - 1)
Next
Range("A1").Resize(N, N) = arr
End Sub
Sub Swap(ByRef iNum1 As Integer, ByRef iNum2 As Integer)
Dim iTemp As Integer
iTemp = iNum1
iNum1 = iNum2
iNum2 = iTemp
End Sub
Option Explicit
Dim N As Long
Dim i As Long
Dim j As Long
Dim c As Long
Dim arr() As Long
Dim temp As Long
Sub MaPhuongChan()
N = WorksheetFunction.Max([A1] + [A1] Mod 2, 4)
Cells.ClearContents
[A1] = N
ReDim arr(1 To N, 1 To N)
For i = 1 To N
For j = 1 To N
arr(i, j) = (i - 1) * N + j
Next j, i
For i = 1 To N / 2
If N Mod 4 = 2 Then
c = (i + N - 2) Mod (N / 2) + 1
temp = arr(i, c)
arr(i, c) = arr(i, N + 1 - c)
arr(i, N + 1 - c) = temp
c = (i + N - 3) Mod (N / 2) + 1
temp = arr(i, c)
arr(i, c) = arr(N + 1 - i, c)
arr(N + 1 - i, c) = temp
End If
For j = 0 To N \ 4 - 1
c = (i + j - 1) Mod (N / 2) + 1
temp = arr(i, c)
arr(i, c) = arr(N + 1 - i, N + 1 - c)
arr(N + 1 - i, N + 1 - c) = temp
temp = arr(i, N + 1 - c)
arr(i, N + 1 - c) = arr(N + 1 - i, c)
arr(N + 1 - i, c) = temp
Next j, i
[B2].Resize(N, N) = arr
[B2].Resize(N, N).Select
End Sub
Bạn em vừa chứng minh vô nghiệm các bác đã có code rồi!Nếu vậy thì bạn sẽ còn ngạc nhiên hơn nếu biết rằng sử dụng cùng một nguyên lý giải nhưng ra được rất nhiều đáp án khác nhau (và code viết tất nhiên cũng hơi khác nhau), đặc biệt là đối với ma phương chẵn.