Помогите, пожалуйста, перебрать все комбинации цифр от 1 до 4 Например дано 1 2 3 4 , в результате получим: 1111 1112 1113 1114 2222 2221 ......
Но не должно быть комбинаций состоящих из одинакового набора цифр. Например: Если есть 1112 то 2111 уже не должно быть. П.С. Понимаю, что комбинаторика и перебор, но уже ни сил нет, ни голова не соображает - всю ночь сижу. Заранее благодарен
Помогите, пожалуйста, перебрать все комбинации цифр от 1 до 4 Например дано 1 2 3 4 , в результате получим: 1111 1112 1113 1114 2222 2221 ......
Но не должно быть комбинаций состоящих из одинакового набора цифр. Например: Если есть 1112 то 2111 уже не должно быть. П.С. Понимаю, что комбинаторика и перебор, но уже ни сил нет, ни голова не соображает - всю ночь сижу. Заранее благодаренAlex_100
Макросом пока заниматься некогда, а вот с этим всё довольно просто. Достаточно, например, выбирать только те комбинации, в которых каждая следующая цифра не меньше предыдущей - и все повторы отсекутся. Например, 1111 1112 1113 1114 1122 1123 1124 1133 1134 1144 1222, и т.д.
Макросом пока заниматься некогда, а вот с этим всё довольно просто. Достаточно, например, выбирать только те комбинации, в которых каждая следующая цифра не меньше предыдущей - и все повторы отсекутся. Например, 1111 1112 1113 1114 1122 1123 1124 1133 1134 1144 1222, и т.д.alex1248
для четырёх - можно тупо в лоб четырьмя циклами (для олимпиад по информатике такой способ не прокатит)[vba]
Код
Sub aTest() Dim i&, j1&, j2&, j3&, j4& For j1 = 1 To 4: For j2 = j1 To 4: For j3 = j2 To 4: For j4 = j3 To 4 i = i + 1: Cells(i, 1) = j1 & j2 & j3 & j4 Next j4, j3, j2, j1 End Sub
[/vba]
для четырёх - можно тупо в лоб четырьмя циклами (для олимпиад по информатике такой способ не прокатит)[vba]
Код
Sub aTest() Dim i&, j1&, j2&, j3&, j4& For j1 = 1 To 4: For j2 = j1 To 4: For j3 = j2 To 4: For j4 = j3 To 4 i = i + 1: Cells(i, 1) = j1 & j2 & j3 & j4 Next j4, j3, j2, j1 End Sub
да, четыре цикла - это не есть бьютефул... нужно было построить троичную с.и. и работать с ней... но оставим это для олимпиад.
бездумный вариант "в лоб": [vba]
Код
Option Explicit
Sub m() Dim i As Integer, j As Integer, k As Integer, l As Integer Dim a(1 To 4) As Integer
Dim sVal As String, sKey As String Dim colIt As New Collection
On Error Resume Next For i = 1 To 4 For j = 1 To 4 For k = 1 To 4 For l = 1 To 4 a(1) = i a(2) = j a(3) = k a(4) = l
sVal = sGetString(a) SortArray a sKey = sGetString(a)
colIt.Add sVal, sKey Next: Next: Next: Next
Dim sMsg As String For i = 1 To colIt.Count sMsg = sMsg & colIt(i) & ", " ' & vbTab ' & vbNewLine ' & ", " Next sMsg = Left$(sMsg, Len(sMsg) - 2)
MsgBox sMsg End Sub
Function SortArray(a() As Integer) As String Dim i As Integer, j As Integer Dim tmp As Integer
For i = 1 To UBound(a) - 1 For j = i + 1 To UBound(a) If a(i) > a(j) Then tmp = a(j) a(j) = a(i) a(i) = tmp End If Next j Next i End Function
Function sGetString(a() As Integer) As String Dim i As Integer, sRes As String For i = 1 To UBound(a) sRes = sRes & CStr(a(i)) Next i sGetString = sRes End Function
[/vba]
да, четыре цикла - это не есть бьютефул... нужно было построить троичную с.и. и работать с ней... но оставим это для олимпиад.
бездумный вариант "в лоб": [vba]
Код
Option Explicit
Sub m() Dim i As Integer, j As Integer, k As Integer, l As Integer Dim a(1 To 4) As Integer
Dim sVal As String, sKey As String Dim colIt As New Collection
On Error Resume Next For i = 1 To 4 For j = 1 To 4 For k = 1 To 4 For l = 1 To 4 a(1) = i a(2) = j a(3) = k a(4) = l
sVal = sGetString(a) SortArray a sKey = sGetString(a)
colIt.Add sVal, sKey Next: Next: Next: Next
Dim sMsg As String For i = 1 To colIt.Count sMsg = sMsg & colIt(i) & ", " ' & vbTab ' & vbNewLine ' & ", " Next sMsg = Left$(sMsg, Len(sMsg) - 2)
MsgBox sMsg End Sub
Function SortArray(a() As Integer) As String Dim i As Integer, j As Integer Dim tmp As Integer
For i = 1 To UBound(a) - 1 For j = i + 1 To UBound(a) If a(i) > a(j) Then tmp = a(j) a(j) = a(i) a(i) = tmp End If Next j Next i End Function
Function sGetString(a() As Integer) As String Dim i As Integer, sRes As String For i = 1 To UBound(a) sRes = sRes & CStr(a(i)) Next i sGetString = sRes End Function
Ребята, всем большое спасибо за помощь! Чуть позже выложу код, который предложили на других форумах, может кому то будет полезным. Еще раз спасибо!
Ребята, всем большое спасибо за помощь! Чуть позже выложу код, который предложили на других форумах, может кому то будет полезным. Еще раз спасибо!Alex_100
И не только там. ЗЫ: Вчера специально искал на форумах, где решение отличается от данных здесь. Не нашел. Не буду загромождать не нужными ссылками.
И не только там. ЗЫ: Вчера специально искал на форумах, где решение отличается от данных здесь. Не нашел. Не буду загромождать не нужными ссылками.ShAM
немного упустил из вида один момент - что нужна не комбинация а простой перебор Где - то вроде видел такой код... когда искал что мне нужно. Если найду - скину
немного упустил из вида один момент - что нужна не комбинация а простой перебор Где - то вроде видел такой код... когда искал что мне нужно. Если найду - скину SLAVICK
А если чисел не 4 а больше или меньше? Обычными вложенными циклами не обойдешься. Вариант перебора чисел, по предложенной схеме на базе алгоритма генерации сочетаний
А если чисел не 4 а больше или меньше? Обычными вложенными циклами не обойдешься. Вариант перебора чисел, по предложенной схеме на базе алгоритма генерации сочетанийMCH