|
|
|
|
|
для: Бамси
(06.12.2008 в 00:11)
| | Обещал выложить свой вариант решения. Как я ранее и говорил, решение аля в лоб.
Зато стабильно работает.
<?php
$col = 8;
$row = 2;
$x = $y = $cnt = 0;
$step = 1;
$array = array('');
$str = '';
for($a=0;$a<$row;$a++)
for($b=0;$b<$col;$b++)
$mat[$a][$b] = ++$cnt;
while(true)
{
if($step == $row || $step == $col) break;
while(true)
{
if(!in_array($mat[$x][$y], $array)) {
$str .= $mat[$x][$y].' ';
$array[] = $mat[$x][$y];
$x++;
} else {
$x = $row-$step;
$y++;
break;
}
}
while(true)
{
if(!in_array($mat[$x][$y], $array)) {
$str .= $mat[$x][$y].' ';
$array[] = $mat[$x][$y];
$y++;
} else {
$y = $col-$step;
$x--;
break;
}
}
while(true)
{
if(!in_array($mat[$x][$y], $array)) {
$str .= $mat[$x][$y].' ';
$array[] = $mat[$x][$y];
$x--;
} else {
$x = $step-1;
$y--;
break;
}
}
while(true)
{
if(!in_array($mat[$x][$y], $array)) {
$str .= $mat[$x][$y].' ';
$array[] = $mat[$x][$y];
$y--;
} else {
$x = $step-1;
$x++;
$y++;
break;
}
}
$step++;
}
echo $str;
?>
|
| |
|
|
|
|
|
|
|
для: Бамси
(07.12.2008 в 17:43)
| | У меня было две, вот только руки до них не дошли - пообщал за выходные собрать из двух старых компов один и отремонтировать принтер. Думал успею быстро, но... еще с компом не все до конца, и плюс на принтере памперс нужно сменить. Поэтому не запускал Денвера и... Идеи следующие. Первая, берем первую колонку и последнюю строку и крайнюю колонку и первую строку, приближаясь постоянно к центру матрицы. Тоже самое, что вам предлагали выше, но только направление определяется четностью итерации цикла и будет меньше вложенных циклов (по идее). Вторая идея практически как и первая, только меняется не направление считывания, а реверсируется полученное колонки и строки (правой колонки и верхних строк), что также определяется четностью итерации цикла. | |
|
|
|
|
|
|
|
для: Бамси
(07.12.2008 в 17:43)
| |
<?
$row = 25; //строки
$col = 9;//колонки
$k = 0;
$j = 0;
$number = 1; //цифры, которыми заполняется двумерный массив
for($i=0; $i < $row * $col; $i++){
for($j = $k; $j < $col - $k; $j++){
$m[$k][$j] = $number;
$number++;
}
for($j = $k+1; $j < $row - $k - 1; $j++){
$m[$j][$col - $k - 1] = $number;
$number++;
}
for($j = $col - $k - 1; $j > $k; $j--){
$m[$row - $k - 1][$j] = $number;
$number++;
}
for($j = $row - $k - 1; $j > $k; $j--){
$m[$j][$k] = $number;
$number++;
}
$k++;
$i++;
}
//вывод матрицы
$matritsa = '<table>';
for($i=0; $i<$row; $i++){
$matritsa .= '<tr>';
for($j=0; $j<$col; $j++){
$matritsa .= '<td>';
$matritsa .= $m[$i][$j];
$matritsa .= '</td>';
}
$matritsa .= '</tr>';
}
$matritsa .= '</table>';
print $matritsa;
?>
|
Только это по часовой стрелке матрица заполняется. Если против часовой, как у вас, пока не не получается вывести в обратном порядке(если сначала строки, потом стобцы уменьшаются), условие для двух внутренних циклов не могу поставить.
Смысл в том, что есть четыре состояния, при которых либо меняется индекс рядов, а строки остаются на месте, либо меняются строки, а номер ряда - тот же самый. Нарисуйте матрицу самую простую - у нее четыре стороны, значит, состояний(циклов) тоже четыре, которые находятся внутри общего цикла. Не знаю, как объяснить понятней. | |
|
|
|
|
|
|
|
для: Бамси
(06.12.2008 в 00:11)
| | Еще варианты решения будут? | |
|
|
|
|
|
|
|
для: xx77
(06.12.2008 в 19:40)
| | У вас, если будет матрица, например, 3 х 4, то на выходе будет лишний элемент, 3 х 5, уже 2 элемента лишних. | |
|
|
|
|
|
|
|
для: xx77
(06.12.2008 в 19:52)
| | ни один не нужен. | |
|
|
|
|
|
|
|
для: Trianon
(06.12.2008 в 19:37)
| | Всмысле второй ?
Вначале так и хотел проверять в цикле strlen($string)<12
и добавлять $string .= array[y][x] но как-уж вышло ,)
а если эта матрица не массив , то в ней больше елементов
, те-же например переносы строк, или как ещё можно было представить эти числа
чтобы работать с ними? | |
|
|
|
|
|
|
|
для: Бамси
(06.12.2008 в 19:19)
| | count($string)<12 имелось ввиду (ширина*высота) вместо 12
вы заменяли это в цикле while ?
( попробовать некогда, главное-же сам процесс придумывания :)) | |
|
|
|
|
|
|
|
для: xx77
(06.12.2008 в 05:42)
| | не нужен здесь массив. | |
|
|
|
|
|
|
|
для: Trianon
(06.12.2008 в 19:35)
| | Буду на месте - выложу свой вариант.
Но там тупо в лоб по методу, который я описывал выше. | |
|
|
|
|