@MeatPixel

Как правильно перебрать такой массив?

Надо перебрать массив данных для игры покер на костях.
Никак не могу решить задачу с составлением комбинации из кубиков.

Собственно массив:
$data = array( //каждый вложенный массив это одна костяшка (всего 5шт)
    array(1,2,6), //конкретная кость, выдает результат 1 при первом броске, 2, при втором и 6 при третьем броске
    array(6,1,5), 
    array(1,2,4), 
    array(3,4,5), 
    array(3,5,6), 
);


Есть 5 кубиков и 3 хода для этого массива, разумеется речь идет об обычной игральной кости на 6 значений.
нужно проверить есть ли комбинация вообще. и если есть, то выдать массив с значением кубика, какой это кубик и в каком ходе выпадет это значение.

Собственно есть и "НО" у нас 3 хода, и если мы возьмем из массива " array(1,2,6), " это одна и та же кость, если мы выберем эту кость в первом ходе (1), то значениями 2 и 6 оперировать уже нельзя, так как эта кость по сути больше не выбрасывается на игровое поле.

я перебрал массив таким вот образом:

$temp = array();

//перебираю значение костяшек, от 1 до 6
for($znacenie=1;$znacenie<7;$znacenie++){
    
    //перебираю конкретную костяшку
    foreach ($data as $ind => $stolb){
        
        //смотрю все 3 броска, если значение выпадает, то записываю его в промежуточный массив
        if(in_array($znacenie,$stolb)){
            $temp[$znacenie][] = $ind;
        }
    }
}


На выходе получаю вот такой вот массив:

$test = array();
$test[1] = array(0,1,2); //Индекс 1 это значение костяшки, 0,1,2 это порядковый номер костяшки, без учета хода
$test[2] = array(0,2);
$test[3] = array(3,4);
$test[4] = array(2,3);
$test[5] = array(1,3,4);
$test[6] = array(0,1,4);


То есть на выходе мне нужно собрать вот такой массив:

//Малый стрит
$result = array();
$result[1] = 0;
$result[2] = 2;
$result[3] = 4;
$result[4] = 3;
$result[5] = 1;

//Стрит
$result = array();
$result[2] = 2;
$result[3] = 4;
$result[4] = 3;
$result[5] = 1;
$result[6] = 0;


Но что-то мне подсказывает, что я совсем не в ту степь опять копаю, Подскажите, как бы вы решили такую задачу?
  • Вопрос задан
  • 109 просмотров
Решения вопроса 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Если я все правильно понял, то у вас всего 5 кубиков и 3 варианта, на каком ходу зафиксировать кубик. Т.е. всего вариантов 3^5 = 243. Это очень мало - их можно все перебрать. Для этого надо или 5 вложенных циклов, или рекурсивная функция, которой передаются уже собранные числа в массиве, какой следующий кубик перебирать. Если еще не все 5 кубиков собраны, то функция гонит цикл из трех вариантов и для каждого дописывает текущий кубик к массиву, рекурсивно запускается, и удаляет последний кубик, чтобы откатить изменения для следующего варианта. Если все 5 кубиков выбраны, то текущий вариант оценивается и, если надо сохраняется.

Тут советую написать отдельную функцию проверки, которая копирует массив (или принимает его по значению), сортирует его и тупо проверяет все варианты (Стрит - arr[0] == 1 && arr[1] == 2 ... && arr[4] = 6, пять одинаковых - все числа равыны. 2+3 - первое==второму, третье==пятому или первое==третьему, четвертое == пятому).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы