Малхасян Г.
20 сообщений
#15 лет назад
Вот ломаю голову над одним вопросом. Может кто поможет.
итак нужно создать 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!=$igra (x={0,9},y={0,9});



то есть такая квадратная матрица где каждый столбик состоит из 0-9 цифр в котором никогда нет одной из этих цифр 2 раза, ио каждая строка тоже....
причем хочется не ограничиватсья на 10ти...


не подскажите код который сгенерирует такую табличку рандомно?
Роман П.
1599 сообщений
#15 лет назад
Напишу код, но за бабло, естественно. Кому охота мозг напрягать бесплатно, за окном воскресенье и +36
Малхасян Г.
20 сообщений
#15 лет назад
Буржуи за бесплатно помогли вот 3 варианта




$baseArray = array(1....10);

$count=0;
for($i=0;$i<=10;$i+) {

do{
$arr = shuffle($baseArray)
}while(!checkDuplicate($arr , $count , $array))
// check if this array is unique


$array = $a;


}

function checkDuplicate($arr , $count , $array){
if($count=0)
return true;
for($i=0;$i<$count;$i++){
if($arr == $array)
return false;
}
return true;
}





вариант 2


function show($matrix){
echo '<table border=1 cellspacing=0 cellpadding=5 style="float: left; margin-right:20px;">';
foreach($matrix as $m){
echo '<tr>';
foreach($m as $n){
echo '<td>'.$n.'</td>';
}
echo '</tr>';
}
echo '</table>';
}

//empty array to store the matrix
$matrix = array();

//this is what keeps the current number to put into matrix
$cnt = 0;

//create the simple matrix
for($i=0;$i<=9;$i++){
for($j=0;$j<=9;$j++){
$matrix = $cnt % 10;
$cnt++;
}
$cnt++;
}

//display valid simple matrix
show($matrix);

//shuffle the rows in matrix to make it random
shuffle($matrix);

//display matrix with shuffled rows.
show($matrix);

//swap the columns in matrix to make it more random.
for($i=0;$i<=9;$i++){
//pick a random column
$r = mt_rand(0, 9);
//now loop through each row and swap the columns $i with $r
for($j=0;$j<=9;$j++){
//store the old column value in another var
$old = $matrix;
//swap the column on this row with the random one
$matrix = $matrix;
$matrix = $old;
}
}

//display final matrix with random rows and cols
show($matrix);
?>
Дмитрий Войциховский
2128 сообщений
#15 лет назад
Гораздо проще создавать такую табличку последовательным перебором, а потом перемешать массив.
Сергей Ш.
293 сообщения
#15 лет назад
Набросал на паскале алгоритм, как то так
var matrix: array  of integer;
number,i,j,vert:integer;
seter:set of 1..10;
vertf:boolean;
begin
for i:= 1 to 10 do
begin
seter:=;
FOR J:= 1 TO 10 DO
begin
vertf:=false;
NUMBER:=Random(10);
writeln(number); readln;
if not (number in seter) then
for vert:=1 to i do
if matrix=number then
VertF:=true;
if Vertf=false then begin
matrix:=number;
include(seter,number); end;
end;
end;

на работоспособность пока проверить нет возможности
Вадим Т.
3240 сообщений
#15 лет назад
maridansoft, то, что Вы хотите получить, называется латинский квадрат, см. .
Самому алгоритм изобретать или просить помощи в данном случае было необязательно, множество вариантов решений находится недолгим гуглением (искать лучше по словам latin square).
Андрей К.
1172 сообщения
#15 лет назад
tvv, то, что он хочет получить, называется генератор Судоку нахаляву.
maridansoft, введите в гугле "судоку php" и следуйте по первой ссылке.
Вадим Т.
3240 сообщений
#15 лет назад
Lisio, вряд-ли ему нужно судоку, судя по проекту
Тем более генераторы судоку обычно заточены на ограниченный размер 9x9, и эти алгоритмы сложнее за счет дополнительного условия — неповторяемости цифр во внутренних квадратах 3х3.

IMHO в данном случае достаточно алгоритмов для построения латинских квадратов, со времен Эйлера их придумали немало.
Андрей К.
1172 сообщения
#15 лет назад
Да, перепутал немного с размером.