Страницы: 1
RSS
Задача о 8 ферзях, нужна помощь для модулирования обработки массива
 
День добрый, форумчане
Код
Sub Prov(a, b, ParamArray tabl()) 'выполняет проверку
'Dim jLeft, jRight, i, j As Integer

'ReDim Tabl(1 To 8, 1 To 8) As Boolean

For i = a To 8
    For j = 1 To 8
        tabl(a, j) = False 'закрашиваем горизонталь
    Next
    tabl(i, b) = False 'закрашиваем вертикаль
Next

jLeft = b
jRight = b

For i = a + 1 To 8 'закрашивание диагоналей начинаем со следующей строки
    jLeft = jLeft - 1
    jRight = jRight + 1
    If jLeft > 0 Then tabl(i, jLeft) = False 'закрашиваем левую диагональ
    If jRight < 9 Then tabl(i, jRight) = False 'закрашиваем правую диагональ

Next
tabl(a, b) = True
End Sub

Задался я вопросом расписать абсолютно все варианты расстановки ферзей из Задача о восьми ферзях. Я знаю, что есть куча решений данной проблемы в сети, но мне захотелось из "спортивного интереса" сделать все самостоятельно, поэтому не предлагайте варианты решений.
Вверху часть кода для решения сей задачи. Я уже нашел частное решение проблемы в графической интерпретации в excel (собственно оттуда и взят код сверху, который был предварительно подкорректирован, NB: это набросок для массивного решения, он не проверялся). Вопрос такой: хочу осуществить обращение к этой процедуре из другой, но не знаю как при этом обрабатывать массив в таком случае.
Вот, например:

Код
sub adf(a,b)
здесь код, описывающий операции над массивом (приведен вверху)
end sub

sub adjdj([здесь разные аргументы])
dim массив(1 to 8, 1 to 8) as boolean
здесь какой-то код
call adf(a,b)
здесь какой-то код
end sub
С уважением,
Федор/Все_просто
 
Сделаю пояснение. Брут форс всех комбинаций будет осуществляться с помощью как минимум 8 циклов, а учитывая что хочу найти все способы, получается не меньше 9. Как минимум в семи абсолютно идентичных циклах будет использоваться обращение к процедуре проверке Prov. Я понимаю, что можно обойтись и без этой проверочной процедуры, просто вставив код самой процедуры в тело цикла. Хотелось бы узнать можно ли все-таки такое обращение наладить?
С уважением,
Федор/Все_просто
 
если я правильно понял, вы хотите передать параметры a и b в процедуру, а назад получить заполненный массив.
тогда самое быстрое объявить этот массив глобально( до всех процедур в модуле):
Код
dim ar(1 to 8, 1 to  8)  as boolean
sub prov(a&, b& ;) 
end sub


можно также объявлять массив в функции и передавать как результат:

Код
function prov(a&, b& ;) 
dim ar (1 to 8, 1 to  8) 
prov=ar
end function


можно передавать массив как параметр( вообще.. не в этом конкретном случае, а когда действительно нужно передать массив как параметр и получить его обратно измененным):

Код
sub prov(a&, b&, ar())
...
end sub


но, повторюсь, быстрее будет глобальный массив. в начале процедуры его, очевидно, придется реинициализировать:
Код
sub prov(a&, b& ;) 
erase ar
end sub
Изменено: Слэн - 10.10.2013 16:09:23
Живи и дай жить..
 
Спасибо за ответ.
Слэн, именно это и имел ввиду - чтобы на выходе был заполненный определенным образом массив. Сам уже подумывал над глобальным декларированием массива, но хотел узнать, что по этому поводу думают другие, более продвинутые, пользователи.
Очень часто в кодах видел вот это:
Код
sub prov(a&, b& ;) 

Можете объяснить здесь наличие точки с запятой и амперсентов?
Изменено: Все_просто - 10.10.2013 16:53:14
С уважением,
Федор/Все_просто
 
Точка с запятой, это скорее всего баг форума, который вместо скобки рисует смайлик, а амперсанд означает, что переменная имеет тип Long
Аналогично записи
sub prov(a As Long, b As Long)
Страницы: 1
Наверх