Vâng ạ, tại em ko biết diễn tả thế nào cho dễ hiểu, mong thầy bỏ quá cho ạ. Theo ý của thầy: "mỗi bộ 3 số tương ứng với 1 hàng nào đó. Trong hàng đó sẽ có 2 số 1 liên tiếp cách nhau xa nhất - khoảng cách đó ta gọi là MAX. Trong tất cả các MAX tương ứng với tất cả các hàng hãy chỉ ra MAX nhỏ nhất, và tương ứng với nó là bộ 3 số nào" e thấy đúng ý rồi ạ. Mới đầu e chỉ có ý tìm ra 1 bộ, nhưng thấy thầy gợi ý tìm ra được nhiều bộ nên cũng muốn học hỏi ạ !. E cảm ơn thầy!
Trời ạ, bạn rút kinh nghiệm lần sau nhé. Hãy miêu tả thật kỹ.
Thôi được, tôi làm cho nhiều kết quả. Nhưng ta hãy thống nhất về một điểm nữa:
Trong bài #3 bạn cho ví dụ về 2 hàng:
hàng 1: 01101010010101 --> max = 2 (2 số 0 giữa số 1 thứ 4 và số 1 thứ 5)
hàng 2: 11111100001111 --> max = 4 (4 số 0 giữa số 1 thứ 6 và số 1 thứ 7)
Với kiểu xét như trên thì với:
hàng 3: 00001010010000
tôi sẽ cho là max = 2 (2 số 0 giữa số 1 thứ 2 và số 1 thứ 3)
Tại sao tôi lại cho là thế khi ở đầu và cuối đều có 4 chữ số 0? Tại sao không phải là max = 4?
Bởi tôi dựa trên 3 câu - 2 câu của bạn và 1 câu của tôi nhưng được bạn "gật đầu"
các số 1 gần sát nhau nhất (bài #1)
khoảng cách lớn nhất giữa 2 số 1 liền kề nhau (bài #3)
...
Trong hàng đó sẽ có 2 số 1 liên tiếp cách nhau xa nhất - khoảng cách đó ta gọi là MAX (bài #5)
Từ các đoạn trích thì thấy khi xác định max cho mỗi hàng thì ta
chỉ xét các số 0 nằm giữa 2 số 1 liên tiếp.
Trong code dưới đây tôi làm với giả thiết max được xác định như cách hiểu ở trên.
[GPECODE=vb]
Sub test()
Dim Arr, i As Long, j As Long, k As Long, index As Long, max As Long, curr_max_123 As Long, max_123 As Long
Dim start As Long, dong1 As Long, dong2 As Long, dong3 As Long, Arr123(), count As Long, Arr_0_1(), r As Long
Arr = Range("B1:CW100").Value
max = 100
For i = 1 To 100
For j = i + 1 To 100
For k = j + 1 To 100
max_123 = 0
' tim so 1 dau tien trong hang
For start = 1 To 100
' gap so 1 dau tien trong hang hien hanh, ra khoi vong lap
If Arr(i, start) + Arr(j, start) + Arr(k, start) > 0 Then Exit For
Next start
' tim cac so 1 tiep theo
For index = start + 1 To 100
' gap so 1 tiep theo (so 1 thu hai trong cap 2 so 1 lien tiep) trong hang hien hanh
If Arr(i, index) + Arr(j, index) + Arr(k, index) > 0 Then
' khoang cach giua 2 so 1 lien tiep hien hanh
curr_max_123 = index - start - 1
' neu khoang cach giua 2 so 1 lien tiep hien hanh lon hon gia tri duoc luu thi cap nhat gia tri duoc luu
If curr_max_123 > max_123 Then max_123 = curr_max_123
' cap nhat chi so cua so 1 dau tien trong cap 2 so 1 lien tiep
start = index
End If
Next index
' neu max ung voi hang hien hanh nho hon gia tri duoc luu thi cap nhat va ghi nho bo 3 so
If max_123 < max Then
count = 1
ReDim Arr123(1 To 3, 1 To count)
' ghi bo 3 so
Arr123(1, count) = i - 1: Arr123(2, count) = j - 1: Arr123(3, count) = k - 1
max = max_123
ElseIf max_123 = max Then
count = count + 1
ReDim Preserve Arr123(1 To 3, 1 To count)
' ghi bo 3 so tiep theo
Arr123(1, count) = i - 1: Arr123(2, count) = j - 1: Arr123(3, count) = k - 1
End If
Next k
Next j
Next i
' ghi tieu de
Range("B102").Value = "M" & ChrW(7895) & "i b" & ChrW(7897) & " ba s" & ChrW(7889) & " n" & ChrW(7857) & "m trong m" & ChrW(7897) & "t c" & ChrW(7897) & "t:"
Range("B103").Resize(3, count).Value = Arr123
Range("B106").Value = "C" & ChrW(225) & "c h" & ChrW(224) & "ng t" & ChrW(432) & ChrW(417) & "ng " & ChrW(7913) & "ng"
' tao mang cac hang ung voi moi bo 3 so
ReDim Arr_0_1(1 To count, 1 To 100)
' di theo tung cot cua Arr123 de xet tung bo 3 so
For r = 1 To count
' bo 3 dong i, j, k
i = Arr123(1, r) + 1: j = Arr123(2, r) + 1: k = Arr123(3, r) + 1
For index = 1 To 100
If Arr(i, index) + Arr(j, index) + Arr(k, index) > 0 Then
Arr_0_1(r, index) = 1
Else
Arr_0_1(r, index) = 0
End If
Next index
Next r
' ghi cac hang
Range("B107").Resize(count, 100).Value = Arr_0_1
End Sub
[/GPECODE]