Giải toán điền số

vanthanhVBA

Thành viên
Hôm nay tôi có một bài toán cho học sinh tiểu học như sau:
Bạn cần đăng nhập để thấy hình ảnh

Có các số 0,1,2,...9 được viết liên tiếp trên cột G, bắt đầu từ ô G1. Người dùng có thể thay đổi dữ kiện input, chẳng hạn bỏ qua số 0, thay vào đó sửa thành 1,2,...9.
Bạn cần đăng nhập để thấy hình ảnh

Các bạn cần viết chương trình sao cho mỗi số xuất hiện trong ô vuông 3x3 chỉ một lần duy nhất, tổng hàng dọc bằng hàng ngang và đường chéo và bằng 10 (hoặc 15, tùy vào dữ kiện đầu vào).
Nào, mời các bạn đưa ra chương trình đáp ứng yêu cầu trên.
 

BGuz

Thành viên mới
10 sẽ không bao giờ là vậy, nhưng đây là một mẫu ngẫu hứng


Tôi là người Hungary, nhưng Google sẽ giúp, :)
 

Ngày Mới

Thành viên
Tôi chưa hiểu đề bài cho lắm:
1. Có phải người dùng được phép xoá 1 số ngẫu nhiên từ 0 đến 9, để đủ 9 số điền vào ô vuông không?
2. Tổng dòng = Tổng cột = tổng chéo là = 10 hết hay 15 hết, hay có thể ngẫu nhiên 10 hoặc 15 ?
 

vanthanhVBA

Thành viên
Input có thể thay đổi. Người dùng có thể xóa một số ngẫu nhiên từ 0 tới 9. Chương trình phải nhận biết ra.
tổng dòng = tổng cột = tổng đường chéo = input (có thể là 10 hết, hoặc 15 hết).
 

Ngày Mới

Thành viên
@vanthanhVBA Các số từ 0 đến 9 để điền vào bảng Là số nguyên hay số thập phân ?. Nếu là số nguyên thì tôi không biết giải bài này :)
 

BGuz

Thành viên mới
@BGuz :
Thank you. Can you instruct how to use your file? In English is fine.
Tôi đã không hoàn toàn hiểu câu hỏi ban đầu kể từ đó. Mô hình hoạt động ngay lập tức là sử dụng các số từ không đến tám hoặc một đến chín. Không thể có biến thể nào khác ở đây! Mô hình hoạt động chỉ bằng một cú nhấp chuột. Các ô màu. Chọn một số! Đây sẽ là lưới ở góc trên bên trái. Điền vào bảng cho điều này. Tất nhiên, đối với một số số nhất định không có lời giải hoàn chỉnh vì chúng không thể nằm trong các góc, nhưng đó đã là toán học. Tôi có muốn một mẫu để giải câu hỏi gốc 10 theo mọi hướng không? Nếu tôi bỏ qua bất kỳ số nào, nó sẽ là 15 theo mọi hướng như thế nào?
 

NhanSu

Thành Viên Nổi Bật

Gọi S là tổng các số, k là số ở ô giữa. Tổng 4 bộ 3 số đi qua ô giữa bằng S + 3*k = 4*S/3 nên S=9*k, S chia hết cho 9. Vì tổng các số từ 0 đến 9 bằng 45 nên để S chia hết cho 9 thì số bị xóa phải chia hết cho 9 là 0 hoặc 9. Mình sẽ nêu cách giải với các số từ 1 đến 9 hoặc từ 0 đến 8 ở bài sau.
@BGuz Let S be the sum of 9 numbers on board, k be the number in center. We calculate the sum of 4 lines that contain the center cell: S+3*k=4*S/3, S=9*k. Because 0+1+2+...+9=45, so the deleted number must be divisible by 9.
 

vanthanhVBA

Thành viên
@NhanSu : Cái công thức này mình chưa hiểu lắm.
S + 3*k = 4*S/3
???

Bạn cần đăng nhập để thấy hình ảnh

4k = S +3a5 trong đó S = a1 + a2 + ... + a9
Vì S = 45 cho nên ở đây chỉ suy ra được k chia hết cho 3. Không liên quan tới phép chia cho 9.
Với giả thiết ban đầu k = 10 thì chương trình đưa ra ngay kết quả bài toán không có đáp số.
 

NhanSu

Thành Viên Nổi Bật

Vì tổng các hàng ngang dọc chéo đều bằng nhau nên a1+a2+a3=a4+a5+a6=a7+a8+a9=S/3 do đó a1+a5+a9=a3+a5+a7=S/3
Tổng của 4 đường ngang dọc chéo đi qua tâm a5 sẽ bằng 4S/3 mà tổng này lại bằng S+3*a5 vì thế S=9*a5
Số k ở bài của mình là số ở giữa, tức là a5 chứ không phải tổng 3 số.
 
Sửa lần cuối:

NhanSu

Thành Viên Nổi Bật

Tiếp nối bài trước, mình trình bày cách điền số từ 1 đến n*n vào bảng n hàng * n cột để tổng các hàng, cột, đường chéo bằng nhau với n lẻ (ở đề bài là n=3). Bảng vuông như vậy gọi là ma phuơng bậc n.
Cách 1:
- Bước 1: Vẽ thêm các ô vào xung quanh bảng ban đầu để có lưới ô vuông (ở đây mình làm với n=5).
- Bước 2: Điền các số vào các hàng của lưới.
- Bước 3: Di chuyển các ô nằm ngoài bảng ban đầu vào trong n ô (ô nào ở trên bảng thì tịnh tiến xuống dưới n ô, ô ở trái tịnh tiến sang phải...)
Bạn cần đăng nhập để thấy hình ảnh
 

NhanSu

Thành Viên Nổi Bật

Cách 2 (phương pháp Siamese): điền lần lượt từ 1 đến n*n
- Bước 1: Ô giữa hàng 1 điền số 1.
- Bước 2: Gọi ô hiện tại là A, ô kế tiếp cần điền là B, ta tìm B theo quy tắc: xét các điều kiện từ trên xuống, thực hiện điều kiện thỏa mãn đầu tiên
+ Nếu A ở hàng 1 cột n (góc trên phải) thì B ở hàng 2 cột n (liền dưới A);
+ Nếu A ở hàng trên cùng thì B ở hàng dưới cùng, cột +1 (bên phải);
+ Nếu A ở cột n thì B ở hàng - 1 (hàng trên), cột 1;
+ Nếu ô ở trên, bên phải A 1 ô còn trống thì B là ô này;
+ B là ô liền dưới A
- Lặp lại bước 2 đến khi hết.
Dưới đây là code cho cách 2 này, bậc của ma phương nhập vào ô A1, các số điền vào bảng bắt đầu từ B2.
Mã:
Sub SolveOddMagicSquare()
    'Solve magic square of odd order n
    Dim n&, i&, j&, k&
    Dim r As Range
    n = [A1]
    i = 1
    j = (n + 1) / 2
    Set r = Range("A1")
    For k = 1 To n * n
        r.Offset(i, j) = k
        If (i = 1) And (j = n) Then
            i = 2
        ElseIf i = 1 Then
            i = n
            j = j + 1
        ElseIf j = n Then
            i = i - 1
            j = 1
        ElseIf r.Offset(i - 1, j + 1).Value > 0 Then
            i = i + 1
        Else
            i = i - 1
            j = j + 1
        End If
    Next
End Sub
 

tuhocvba

Administrator
Thành viên BQT
Từ đâu ra được cách nghĩ này nhỉ?
Bạn cần đăng nhập để thấy hình ảnh
 

Ngày Mới

Thành viên
Giống như các giải mà @NhanSu trình bày để giải một ma phương lẻ cấp 3. Việc giải một ma phương khi bỏ số 0 hoặc số 9 khỏi dãi số từ 0 đến 9 có thể được trình bày như sau:
Bạn cần đăng nhập để thấy hình ảnh



Tôi vẫn thật sự chưa nghĩ ra khi lấy ra một số ngẫu nhiên từ 0 đến 9 trong ma phương n=3, thì làm sao để tổng ngang = tổng dọc = tổng chéo = 10 hoặc 15 được? vì không chia hết cho 3 ==> Không có số trung tâm nào thoả mãn. Chỉ khi nào bỏ số 0 hoặc số 9 thì bài toán này mới có thể giải được.
Ai đó cho tôi một ý tưởng?. Ví dụ như bỏ số 5, thì bài toán sẽ giải như thế nào?
 
Sửa lần cuối:

NhanSu

Thành Viên Nổi Bật

@Ngày Mới mình đã lý giải ở bài 8 và 10.
@tuhocvba không biết cách này do ai nghĩ ra, dễ thực hiện trên giấy nhưng lại khó code hơn cách 2. Cách 2 còn dùng để giải ma phương bậc 4k+2 khó hơn nhiều.
 

tuhocvba

Administrator
Thành viên BQT
@NhanSu : Nếu có thể hãy thử tìm cách mô hình hóa cho dễ hiểu hơn, mình đọc vẫn chưa hiểu gì này. Cảm ơn bạn.
 

NhanSu

Thành Viên Nổi Bật

Bạn cần đăng nhập để thấy hình ảnh

Mình làm với n=5, điền số từ 1 đến 25 vào B2:F6. Vẽ thêm các ô màu xanh ở trên (hàng 1), màu vàng (cột G), riêng ô G1 màu đỏ. Quy tắc đi lên trên 1 hàng và sang phải 1 cột, nếu gặp ô màu xanh thì chuyển xuống hàng cuối (hàng 6, vẫn sang phải 1 cột), gặp ô màu vàng thì chuyển sang cột ngoài cùng bên trái (cột B, vẫn lên trên một hàng), gặp ô màu đỏ hoặc ô đã điền số thì xuống dưới ô hiện tại 1 dòng và giữ nguyên cột:
- Bước 1: điền 1 vào ô trên cùng, cột giữa (ô D2=1)
- Bước 2: ô ở trên 1 hàng, bên phải 1 cột của ô hiện tại là E1 có màu xanh (mình điền 2a để dễ nhìn), ô số 2 điền xuống dòng cuối (ô E6=2)
- Bước 3: điền 3 vào ô ở trên , phải ô 2 (F5=3)
- Bước 4: Ô trên, phải F5 là G4 màu vàng nên B4=4
- Bước 5: C3=5
- Bước 6: do ô ở trên, phải C3 là D2 đã điền số 1 nên ô dưới C3 là C4=6
- Bước 16: do ô F2=15 ở góc trên bên phải của ma trận (ô G1 màu đỏ) nên ô dưới của F2 là F3=16
- Cứ tiếp tục điền số đến hết.
 

NhanSu

Thành Viên Nổi Bật

Cách giải ma phương bậc 4k+2, ở file đính kèm mình làm với ma phương bậc n=10 (k=2). Chia ma phương thành các ô nhỏ 2*2, điền số từ 1 đến (2k+1)*(2k+1) vào các ô vuông của ma phương theo quy tắc Siamese như bài trên, mỗi ô vuông 2*2 điền 4 số giống nhau. Biến đổi các số trong mỗi ô 2*2 theo quy tắc LUX như sau:
- (2k+2) dòng trên cùng (tô màu vàng) chia thành (k+1)*(2k+1) hình vuông 2*2 điền số dạng L (trừ hình vuông 2*2 ở chính giữa ma phương điền số dạng U sẽ nói ở bước sau). Cách điền số dạng L vào hình vuông 2*2 (4 ô ở hình vuông này đang được điền số a): điền theo thứ tự trái sang phải, trên xuống dưới 4*a, 4*a-3, 4*a-2, 4*a-1 (với a=1 ta điền theo thứ tự 4123);
- 2 Dòng ở dưới các dòng L màu xanh lá đánh số theo quy tắc U (riêng hình vuông 2*2 ở giữa đánh theo quy tắc L): 4*a-3, 4*a, 4*a-2, 4*a-1 (với a=1 điền theo thứ tự 1423)
- (2k-2) dòng dưới cùng đánh số theo quy tắc X: 4*a-3, 4*a, 4*a-1, 4*a-2 (1432)
Bạn cần đăng nhập để thấy hình ảnh

 

tuhocvba

Administrator
Thành viên BQT
Bạn cần đăng nhập để thấy đính kèm

Mình làm với n=5, điền số từ 1 đến 25 vào B2:F6. Vẽ thêm các ô màu xanh ở trên (hàng 1), màu vàng (cột G), riêng ô G1 màu đỏ. Quy tắc đi lên trên 1 hàng và sang phải 1 cột, nếu gặp ô màu xanh thì chuyển xuống hàng cuối (hàng 6, vẫn sang phải 1 cột), gặp ô màu vàng thì chuyển sang cột ngoài cùng bên trái (cột B, vẫn lên trên một hàng), gặp ô màu đỏ hoặc ô đã điền số thì xuống dưới ô hiện tại 1 dòng và giữ nguyên cột:
- Bước 1: điền 1 vào ô trên cùng, cột giữa (ô D2=1)
- Bước 2: ô ở trên 1 hàng, bên phải 1 cột của ô hiện tại là E1 có màu xanh (mình điền 2a để dễ nhìn), ô số 2 điền xuống dòng cuối (ô E6=2)
- Bước 3: điền 3 vào ô ở trên , phải ô 2 (F5=3)
- Bước 4: Ô trên, phải F5 là G4 màu vàng nên B4=4
- Bước 5: C3=5
- Bước 6: do ô ở trên, phải C3 là D2 đã điền số 1 nên ô dưới C3 là C4=6
- Bước 16: do ô F2=15 ở góc trên bên phải của ma trận (ô G1 màu đỏ) nên ô dưới của F2 là F3=16
- Cứ tiếp tục điền số đến hết.
Cảm ơn @NhanSu, có hình ảnh minh họa, nên bài viết trở nên vô cùng dễ hiểu. Cảm ơn bạn rất nhiều.
Nếu có thêm chút gia vị, hoàn cảnh nào nảy sinh ra cách nghĩ thuật toán như này thì sẽ tuyệt vời hơn nữa đấy.
 

NhanSu

Thành Viên Nổi Bật

Tại sao tác giả nghĩ ra thuật toán thì mình không rõ còn nguyên nhân có tên gọi đó thì ở
Tiếng Anh dài quá.
 
Top