Nhờ kiểm tra Code tự động điền vào các vùng khác nhau trong 1 bảng tính (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

khuongvietphong

Be all you can be !
Tham gia
6/7/14
Bài viết
2,069
Được thích
1,444
Nghề nghiệp
Ăn không ngồi rồi ^.^
Nhờ các anh chị kiểm tra giúp em xem đoạn Code trong File nó bị "bệnh" gì mà khi chạy lại báo lỗi ạ.

Chi tiết và ví dụ cụ thể em ghi trong File rồi đó. Em cảm ơn mọi người !
 

File đính kèm

Lúc đầu mình lo tràn bộ nhớ khi dùng đệ quy, sau mới thấy có 8! khoảng 40k khả năng thì đệ quy đơn giản. Để tạo ra các hoán vị, mình lập hàm tham số n là kích thước bàn cờ, hàm trả về mảng, mỗi phần tử mảng là chuỗi chỉ vị trí con hậu. Hàm được lập bằng đệ quy, với mỗi chuỗi gồm các ký tự từ 1 đến n-1 ta nhét thêm ký tự n vào n vị trí. Ví dụ từ chuỗi 12 là các con hậu ở hàng 1 cột 1, hàng 2 cột 2; ta thêm số 3 thành 312, 132, 123. Sau khi có tất cả 8! hoán vị thì kiểm tra từng hoán vị bằng cách tách các chữ số trong chuỗi vào mảng a (1 to 8) chẳng hạn rồi kiểm tra xem a(i)+i và a (i)-i có trùng nhau không. Kết quả hình như có 92 cách xếp 8 con hậu, sau đó lọc ra các cách xếp có con hậu ở vị trí cho trước.

ờ được rồi . Lúc đầu tôi không tính làm vì khả năng 99% em Phong không biết đệ quy , có làm cũng như không
Bây giờ có "người lớn" tham gia thì lại phải tính khác . Nếu sẵn lòng , mời bạn góp vui vài đoạn code theo ý tưởng của bạn để giải bài toán này : đặt trước 1 con ở vị trí bất kì , tìm chỗ cho 7 con còn lại . Để đơn giản ta chỉ lấy kết quả đầu tiên tìm được .
Theo như bạn diễn tả thì ý tưởng của bạn khác tôi rồi đấy , bạn cứ ra tay trước rồi tôi cũng góp vui sau để tất cả cùng học nhé . ;;;;;;;;;;;;;;;;;;;;;;
 
Upvote 0
Tiếc là máy tính mình hỏng ngay sau khi tìm được 92 cách xếp 8 con hậu. Không biết có sửa kịp trong ngày hôm nay không.
 
Upvote 0
Làm góp vui, code không đẹp nhưng chạy được, các bạn góp ý dùm cám ơn
 

File đính kèm

Upvote 0
Thử mò đại ai ngờ thấy không sai.

Vì còn nhiều người có nhiều cách khác nên tạm thời chưa công bố code. Code sẽ công bố khi không còn người tham gia viết code cho bài này.

Code này tìm thấy thì dừng chứ không tìm hết.
 

File đính kèm

Upvote 0
Tiếc là máy tính mình hỏng ngay sau khi tìm được 92 cách xếp 8 con hậu. Không biết có sửa kịp trong ngày hôm nay không.

Không biết có bao nhiêu cách nhưng đủ 8 ô thì dừng.
Nhập thí thí cái gì đó vào trong khung.
----------------------
Bài này viết theo ý của "Lão chết tiệt" ở bài #8
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Không biết có bao nhiêu cách nhưng đủ 8 ô thì dừng.
Nhập thí thí cái gì đó vào trong khung.
----------------------
Bài này viết theo ý của "Lão chết tiệt" ở bài #8

Hì hì, mở xem Code của thầy thấy ngắn --> mừng quá --> cứ tưởng thế là bài này giải quyết được ngắn gọn vầy là ngon rồi. Chốc

quay ra thử ai zè thấy kết quả bị trật thầy ạ
 
Upvote 0
Hì hì, mở xem Code của thầy thấy ngắn --> mừng quá --> cứ tưởng thế là bài này giải quyết được ngắn gọn vầy là ngon rồi. Chốc

quay ra thử ai zè thấy kết quả bị trật thầy ạ
Bác Ba chưa nắm quy tắc trò chơi rồi --=0
Đây là tất cả các cách xếp. Đúng là có 92 cách xếp khác nhau.

Code sẽ được post sau.
 

File đính kèm

Upvote 0
Bác Ba chưa nắm quy tắc trò chơi rồi --=0
Đây là tất cả các cách xếp. Đúng là có 92 cách xếp khác nhau.

Code sẽ được post sau.

Híc!
Hình như tôi chỉ làm theo ý của "Lão chết tiệt" ở bài #8 gợi ý cách giải bài #7 mà.
Tìm 8 vị trí bất kỳ để con Hậu không "ăn" được 8 con Hậu khác!
Nếu hiểu sai thì "già rồi lẩm cẩm" thiệt.
 
Lần chỉnh sửa cuối:
Upvote 0
Híc!
Hình như tôi chỉ làm theo ý của "Lão chết tiệt" ở bài #8 gợi ý cách giải bài #7 mà.
Tìm 8 vị trí bất kỳ để con Hậu không "ăn" được 8 con Hậu khác!
Nếu hiểu sai thì "già rồi lẩm cẩm" thiệt.
Làm như lão chết tiệt không nói sai bao giờ á. Nhưng dù sai cũng ngó kết quả 1 cái chứ bạn già.
Ý của tui là vừa không cùng dòng cột, vừa không cùng đường chéo. Nhưng lẽ ra con thứ i phải so với tất cả (i - 1) con đã có trước nó, chứ không chỉ so với con liền kề.
Có điều dùng vòng lặp sắp tuần tự đến hết là không được.
 
Upvote 0
Làm như lão chết tiệt không nói sai bao giờ á. Nhưng dù sai cũng ngó kết quả 1 cái chứ bạn già.
Ý của tui là vừa không cùng dòng cột, vừa không cùng đường chéo. Nhưng lẽ ra con thứ i phải so với tất cả (i - 1) con đã có trước nó, chứ không chỉ so với con liền kề.
Có điều dùng vòng lặp sắp tuần tự đến hết là không được.

Ái da!
Đúng là hồ đồ vì không "gành" về con Hậu.
Tôi chưa xét trường hợp 8 con hậu không "ăn" được lẫn nhau nữa.
Xin chịu. Xin chịu ... lỗi. Sẽ "ngâm kiếu" lại.
 
Upvote 0
Mình up code của mình, gõ chữ "x" vào ô bất kỳ trên bàn cờ. Chạy sub main để điền các ô còn lại.
 

File đính kèm

Upvote 0
mình cũng góp vui vài đoạn -+*/-+*/

Code tại sự kiện change của sheet ( vùng B8:I16)

Mã:
Private Sub Worksheet_Change(ByVal target As Range)
Dim myRgn As Range
Set myRgn = Me.Range("B" & "8" & ":" & "I" & "1" & "5")
If target.Count = 1 Then
If Not Intersect(target, myRgn) Is Nothing Then
If target.Value <> "" Then
Func1 myRgn, target
Else: myRgn.ClearContents: End If: End If: End If: End Sub

code tại Module

Mã:
Private gbVar1 As Long


Sub Func1(ByVal pram1 As Range, ByVal pram2 As Range)
Dim Var1() As Boolean, Var2(1 To 8, 1 To 8) As String, Var4 As Long, Var5 As Long
ReDim Var1(1 To pram1.Rows.Count, 1 To pram1.Columns.Count)
Var1(pram2.Row - pram1.Row + 1, pram2.Column - pram1.Column + 1) = True
gbVar1 = 0
Func2 Var1, 1
For Var4 = 1 To 8
For Var5 = 1 To 8
If Var1(Var4, Var5) Then Var2(Var4, Var5) = pram2.Value
Next
Next
pram1.Value = Var2
End Sub


Private Sub Func2(ByRef Var1() As Boolean, ByVal pram4 As Long)
Dim Var4 As Long, Var5 As Long, Var8, Var9 As Long
If gbVar1 = 8 Then Exit Sub
For Var4 = 1 To 8
If Var1(pram4, Var4) Then
Func2 Var1, pram4 + 1
Exit Sub
End If
Next
Var8 = Var1
For Var9 = 1 To 8
If gbVar1 = 8 Then Exit Sub
Var1 = Var8
Var1(pram4, Var9) = True
If Not Func3(Var1) Then
Func2 Var1, pram4 + 1
End If
Next
End Sub




Function Func3(ByRef Var1() As Boolean) As Boolean
Dim Var4 As Long, Var5 As Long, Var12 As Boolean
For Var4 = 1 To 8
Var12 = False
For Var5 = 1 To 8
If Var1(Var4, Var5) And Var12 Then
Func3 = True
Exit Function
Else
Var12 = Var1(Var4, Var5) Or Var12
End If
Next
Var12 = False
For Var5 = 1 To 8
If Var1(Var5, Var4) And Var12 Then
Func3 = True
Exit Function
Else
Var12 = Var1(Var5, Var4) Or Var12
End If
Next
Next
For Var4 = 1 To 7
Var12 = False
For Var5 = 1 To Var4
If Var1(Var4 - Var5 + 1, Var5) And Var12 Then
Func3 = True
Exit Function
Else
Var12 = Var1(Var4 - Var5 + 1, Var5) Or Var12
End If
Next
Var12 = False
For Var5 = 1 To 9 - Var4
If Var1(Var4 + Var5 - 1, Var5) And Var12 Then
Func3 = True
Exit Function
Else
Var12 = Var1(Var4 + Var5 - 1, Var5) Or Var12
End If
Next
Var12 = False
For Var5 = 9 - Var4 To 8
If Var1(Var4 + Var5 - 8, Var5) And Var12 Then
Func3 = True
Exit Function
Else
Var12 = Var1(Var4 + Var5 - 8, Var5) Or Var12
End If
Next
Var12 = False
For Var5 = Var4 To 8
If Var1(8 + Var4 - Var5, Var5) And Var12 Then
Func3 = True
Exit Function
Else
Var12 = Var1(8 + Var4 - Var5, Var5) Or Var12
End If
Next
Next
gbVar1 = 0
For Var4 = 1 To 8
For Var5 = 1 To 8
If Var1(Var4, Var5) Then gbVar1 = gbVar1 + 1
Next
Next
End Function
 
Upvote 0
Như được dịch ngược bằng VB decompiler. Đề nghị bỏ mấy dòng khai báo biến đi cho khó hiểu hơn!
 
Upvote 0
được dịch từ VBA sang VBA , đố bạn biết VBA gốc nằm ở đâu ? +-+-+-++-+-+-+
Code này đơn giản nên việc tìm và thay thế cũng không mấy khó khăn. Chỉ có điều tên biến không mô tả nội dung nó lưu trữ nên việc đọc cũng hơi khó khăn. Nếu một dự án lớn thì việc dịch ngược cũng mất không ít thời gian à --=0

Đã vậy thì tôi gửi code luôn vậy.

Cũng dạng này nhưng có đề bài khó hơn: Viết code giải ô số Sudoku. Ai có hứng thú thì nhào vô --=0
 

File đính kèm

Upvote 0
Code này đơn giản nên việc tìm và thay thế cũng không mấy khó khăn. Chỉ có điều tên biến không mô tả nội dung nó lưu trữ nên việc đọc cũng hơi khó khăn. Nếu một dự án lớn thì việc dịch ngược cũng mất không ít thời gian à --=0

Đã vậy thì tôi gửi code luôn vậy.

Cũng dạng này nhưng có đề bài khó hơn: Viết code giải ô số Sudoku. Ai có hứng thú thì nhào vô --=0

mình không được học hành gì nhiều , nên chỉ biết tự viết mã để replace các kí tự thôi à
Nếu có lòng , mời bạn cho mình thưởng thức dự án không nhỏ nào đó để giúp mình hoàn thiện cỗ máy replace với -+*/-+*/

Đây là cách của mình với bài này , code đặt chung hết vào module của sheet

Mã:
Option Explicit
Private userRow As Long, userCol As Long, EndGame As Boolean, strResult As String


Private Sub Worksheet_Change(ByVal target As Range)
Dim BanCo As Range, giatri, r As Long
EndGame = False
Set BanCo = Sheet1.Range("B8:I16")
giatri = target.Value
If Not IsArray(giatri) And Not Intersect(target, BanCo) Is Nothing Then
    userRow = target.Row - 7
    userCol = target.Column - 1
    hell 1, ""
    If EndGame Then
        Application.EnableEvents = False
        BanCo.ClearContents
        For r = 1 To 8 Step 1
            BanCo(Mid(strResult, r, 1), r) = giatri
        Next
        Application.EnableEvents = True
    Else
        MsgBox "ho^ng? tim` thay'"
    End If
End If
End Sub


Private Sub hell(Col As Long, tmp As String)
Dim r As Long, u As Long
If Not EndGame Then
    If Col < 9 Then
        If Col <> userCol Then
            For r = 1 To 8 Step 1
                If InStr(1, tmp, r) = 0 And r <> userRow Then
                    For u = 1 To Col - 1 Step 1
                        If Abs(Mid(tmp, u, 1) - r) = Col - u Then Exit For
                    Next
                    If u > Col - 1 And Abs(userRow - r) <> Abs(userCol - Col) Then hell Col + 1, tmp & r
                End If
            Next
        Else
            hell Col + 1, tmp & userRow
        End If
    Else
        EndGame = True
        strResult = tmp
    End If
End If
End Sub

Nếu thích giao lưu Soduku mà phải điền bằng tay thì khổ lắm
Bạn có lòng tốt thì giúp mọi người 1 đoạn code lấy đề bài Sudoku từ trên mạng xuống trước đi , để có cái mà làm . --=0--=0
 

File đính kèm

Upvote 0

File đính kèm

Upvote 0
mình không được học hành gì nhiều , nên chỉ biết tự viết mã để replace các kí tự thôi à
Nếu có lòng , mời bạn cho mình thưởng thức dự án không nhỏ nào đó để giúp mình hoàn thiện cỗ máy replace với -+*/-+*/
Tôi dịch bằng VBA nên cũng chẳng có gì ngạc nhiên khi một ai đó dùng VBA để dịch lại. Tuy nhiên cũng bởi vì tôi tự làm nên tôi biết không đơn giản chỉ là thay thế các biến.

Dự án lớn thì tôi không tiện đưa lên. Nhưng nếu bạn có hứng thú thì tạm nghiên cứu file này trước vậy.
Nếu thích giao lưu Soduku mà phải điền bằng tay thì khổ lắm
Bạn có lòng tốt thì giúp mọi người 1 đoạn code lấy đề bài Sudoku từ trên mạng xuống trước đi , để có cái mà làm . --=0--=0
Đề Sudoku thì dễ thôi. Bạn HieuCD đã đưa lên rồi đấy. Chắc đủ cho bạn test, khỏi cần lấy trên mạng nữa nhỉ.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom