|
|
|
| Задается пара натуральных чисел, это размер прямоугольной матрицы (таблицы).
Скрипт должна ее распечатывать "в линию", по спирали.
С верхнего левого угла потом вниз, потом направо, потом вверх и влево..и так до центра.
1 2 3 4
5 6 7 8
9 10 11 12
1 5 9 10 11 12 8 4 3 2 6 7 | |
|
|
|
|
|
|
|
для: Бамси
(06.12.2008 в 00:11)
| | > 1 2 3 4
> 5 6 7 8
> 9 10 11 12
> 1 5 9 10 11 12 8 4 3 2 6 7
И что весь этот набор чисел значит? | |
|
|
|
|
|
|
|
для: BinLaden
(06.12.2008 в 01:26)
| | Пример.
Как из матрицы сделали, то что просили по спирали.
1 2 3 4
5 6 7 8
9 10 11 12
|
1 5 9 10 11 12 8 4 3 2 6 7
|
| |
|
|
|
|
|
|
|
для: Бамси
(06.12.2008 в 01:32)
| | Спираль Архимеда :) А чем обусловлена такая задача, если не секрет? | |
|
|
|
|
|
|
|
для: sim5
(06.12.2008 в 01:48)
| | Проверка при приеме на работу...
не мне. | |
|
|
|
|
|
|
|
для: Бамси
(06.12.2008 в 02:11)
| | Понял. Проверка на профпригодность контроллера CD и DVD дисков. )
PS. А исходный массив, это точно многомерный, или это вы его так прописали в примере? | |
|
|
|
|
|
|
|
для: sim5
(06.12.2008 в 02:19)
| | Угу и этикеточки в коробочки засовывать.
Это я его так прописал.
Я просто не представляю как матрица не может быть многомерной. | |
|
|
|
|
|
|
|
для: Бамси
(06.12.2008 в 02:26)
| | Матрица да, я к тому, что может быть требовалось одномерный массив (да просто последовательность) разложить N*N. Сейчас подумаем. | |
|
|
|
|
|
|
|
для: sim5
(06.12.2008 в 02:39)
| | Кто выложит самое короткое решение, тому cheops автомобиль подарит -- новая тема для раздела задач! | |
|
|
|
|
|
|
|
для: BinLaden
(06.12.2008 в 03:22)
| | Это смотря какой автомобиль, если "Запорожец", то обязательно прийму участие - давно мечтал о таком. :) | |
|
|
|
|
|
|
|
для: sim5
(06.12.2008 в 03:24)
| | Я начинал делать что-то типо бесконечного цыкла, и просто доходя до края массива он изменял направление, а пройденные части матрицы заменял допустим на x. И когда встречал ичейку x то меня л направление. Ну и понятное дело когда во все стороны была ячейка x, то он прекращал цыкл.
Но это такой код получается... у... | |
|
|
|
|
|
|
|
для: Бамси
(06.12.2008 в 03:46)
| | Нет, у меня другая идея, сейчас подумаю как выгоднее сделать. | |
|
|
|
|
|
|
|
для: sim5
(06.12.2008 в 04:16)
| | что-то такое
<?
$v = $x = $y = 0;
$XMX = 4; // maximum x
$YMX = 3; // maximum y
for($y; $y<$YMX; $y++) {
$array[$y] = array();
for($x; $x<$XMX; $x++) {
$array[$y][$x] = ($v+=1);
}
$x = 0;
}
$y = 0;
// print_r($array);
$string[] = $array[0][0];
$xmin = $ymin = 0; // minimum
$XMX--;
$YMX--;
while(count($string)<12) { // V> Л <
while($y<$YMX) {
$string[] = $array[($y+=1)][$x];
}
$xmin++;
while($x<$XMX) {
$string[] = $array[$y][($x+=1)];
}
$YMX--;
while($y>$ymin) {
$string[] = $array[($y-=1)][$x];
}
$XMX--;
while($x>$xmin) {
$string[] = $array[$y][($x-=1)];
}
$ymin++;
}
print_r($string);
?>
|
| |
|
|
|
|
|
|
|
для: xx77
(06.12.2008 в 05:42)
| | Не всегда будет правильно. | |
|
|
|
|
|
|
|
для: sim5
(06.12.2008 в 08:08)
| |
$XMX = 3; // maximum x
$YMX = 2; // maximum y
|
Fatal error: Maximum execution time of 30 seconds exceeded in D:\www\1.php on line 22 | |
|
|
|
|
|
|
|
для: Бамси
(06.12.2008 в 19:19)
| | а как её решил претендент ? | |
|
|
|
|
|
|
|
для: Trianon
(06.12.2008 в 19:35)
| | Буду на месте - выложу свой вариант.
Но там тупо в лоб по методу, который я описывал выше. | |
|
|
|
|
|
|
|
для: Бамси
(06.12.2008 в 19:19)
| | count($string)<12 имелось ввиду (ширина*высота) вместо 12
вы заменяли это в цикле while ?
( попробовать некогда, главное-же сам процесс придумывания :)) | |
|
|
|
|
|
|
|
для: xx77
(06.12.2008 в 19:40)
| | У вас, если будет матрица, например, 3 х 4, то на выходе будет лишний элемент, 3 х 5, уже 2 элемента лишних. | |
|
|
|
|
|
|
|
для: xx77
(06.12.2008 в 05:42)
| | не нужен здесь массив. | |
|
|
|
|
|
|
|
для: Trianon
(06.12.2008 в 19:37)
| | Всмысле второй ?
Вначале так и хотел проверять в цикле strlen($string)<12
и добавлять $string .= array[y][x] но как-уж вышло ,)
а если эта матрица не массив , то в ней больше елементов
, те-же например переносы строк, или как ещё можно было представить эти числа
чтобы работать с ними? | |
|
|
|
|
|
|
|
для: xx77
(06.12.2008 в 19:52)
| | ни один не нужен. | |
|
|
|
|
|
|
|
для: Бамси
(06.12.2008 в 00:11)
| | Еще варианты решения будут? | |
|
|
|
|
|
|
|
для: Бамси
(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;
?>
|
Только это по часовой стрелке матрица заполняется. Если против часовой, как у вас, пока не не получается вывести в обратном порядке(если сначала строки, потом стобцы уменьшаются), условие для двух внутренних циклов не могу поставить.
Смысл в том, что есть четыре состояния, при которых либо меняется индекс рядов, а строки остаются на месте, либо меняются строки, а номер ряда - тот же самый. Нарисуйте матрицу самую простую - у нее четыре стороны, значит, состояний(циклов) тоже четыре, которые находятся внутри общего цикла. Не знаю, как объяснить понятней. | |
|
|
|
|
|
|
|
для: Бамси
(07.12.2008 в 17:43)
| | У меня было две, вот только руки до них не дошли - пообщал за выходные собрать из двух старых компов один и отремонтировать принтер. Думал успею быстро, но... еще с компом не все до конца, и плюс на принтере памперс нужно сменить. Поэтому не запускал Денвера и... Идеи следующие. Первая, берем первую колонку и последнюю строку и крайнюю колонку и первую строку, приближаясь постоянно к центру матрицы. Тоже самое, что вам предлагали выше, но только направление определяется четностью итерации цикла и будет меньше вложенных циклов (по идее). Вторая идея практически как и первая, только меняется не направление считывания, а реверсируется полученное колонки и строки (правой колонки и верхних строк), что также определяется четностью итерации цикла. | |
|
|
|
|
|
|
|
для: Бамси
(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;
?>
|
| |
|
|
|