помогите генерировать массив

Тема в разделе "Как сделать...", создана пользователем bobo85, 18 июл 2010.

Статус темы:
Закрыта.
  1. bobo85

    bobo85 Постоялец

    Регистр.:
    29 окт 2006
    Сообщения:
    124
    Симпатии:
    1
    Вот ломаю голову над одним вопросом. Может кто поможет.
    итак нужно создать или генерировать 2хмерный массив .значит массив должен иметь такой вид
    значит нужно чтоб массив состоял из 10массивов , назовем их подмассивами.
    подмассивы должны состоять из номеров 0-9. причем номер не может 2жды повторятья. это первое условие.

    Код:
    
    $igra[]=array(0,1,2,3,4,5,6,7,8,9);
    $igra[]=array(6,0,1,5,9,2,7,3,4,8);
    $igra[]=array(2,......................
    $igra[]=array(1,......................
    $igra[]=array(5,
    $igra[]=array(4,
    $igra[]=array(9,
    $igra[]=array(8,
    $igra[]=array(7,
    $igra[]=array(3,
    
    где  
    $igra[x][z]!=$igra[y][z]   (x={0,9},y={0,9});
    
    
    
    то есть такая квадратная матрица где каждый столбик состоит из 0-9 цифр в котором никогда нет одной из этих цифр 2 раза, ио каждая строка тоже....
    причем хочется не ограничиватсья на 10ти...


    не подскажите код который сгенерирует такую табличку рандомно?
     
  2. Liver

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    Как то вот так. Рабочесть не проверял, писал в блокноте по быстрому.
    PHP:
    $size=10;

    $numbers=array();
    //заполняем массив чисед
    for($i=0;$i<$size;$i++){
        
    $numbers[]=$i;
    }

    //строим матрицу из всех возможных комбинаций с учетом уникальнсоти по столбику и строке
    $igra=array();
    for(
    $i=0;$i<$size;$i++){
        
    $igra[]=$numbers;
        
    //сдвигаем массив циклично на 1 элемент
        
    array_unshift($numbersarray_pop($numbers));
    }

    //перемешиваем получившуюся матрицу
    shuffle($igra);
     
  3. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    :D как вариант случайной выборки и инвертированной матрицы-
    PHP:
    $size =10;
    for(
    $n=0$n<$size; ++$n){    
        
    $number_arrs[] = $n;

    }
    for(
    $flag=0$iteration=0; !$flag ; ++$iteration){//&& $iteration<100
    $flag =1;
    $matrix = array();
    $matrix_inv = array();
    $i=0;

    for(
    $y=0$y<$size; ++$y){
        
    $number_arr $number_arrs;
    shuffle($number_arr);


        for(
    $x=0$x<$size; ++$x){
        
     
            
    $random_n=false;
            foreach(
    $number_arr as $n_is=>$r){
                if(@
    in_array($r, @$matrix_inv[$x] )   ){
                    continue;
                }
                
    $random_n $r;
                unset(
    $number_arr[$n_is]);
                break;
            }
                 if(
    $random_n===false){
                    
    $flag =0;
                    break 
    2;
                }    
       
               
    $matrix_inv[$x][$y]=$random_n;
                
    $matrix[$y][$x]=$random_n;         

        }

    }

    echo 
    "Попыток $iteration<br>";
    foreach(
    $matrix as $y=>$str){
        foreach(
    $str as $x=>$num){
            echo 
    "| $num | ";
        
        }
          echo 
    "<br>";
    }

    Массив заполняется построчно случайными значениями, при возникновении ошибки всё начинается сначала). При небольших размерах матрицы заполняется быстро. При больших размерах- количество невозможных ситуаций увеличивается оч значительно и больше 10 ставить не рекомендуется.
     
Статус темы:
Закрыта.