Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Задачка: распечатка матрицы по спирали
 
 автор: Бамси   (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)   письмо автору
 
   для: Бамси   (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

И что весь этот набор чисел значит?

  Ответить  
 
 автор: Бамси   (06.12.2008 в 01:32)   письмо автору
 
   для: 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

  Ответить  
 
 автор: sim5   (06.12.2008 в 01:48)   письмо автору
 
   для: Бамси   (06.12.2008 в 01:32)
 

Спираль Архимеда :) А чем обусловлена такая задача, если не секрет?

  Ответить  
 
 автор: Бамси   (06.12.2008 в 02:11)   письмо автору
 
   для: sim5   (06.12.2008 в 01:48)
 

Проверка при приеме на работу...
не мне.

  Ответить  
 
 автор: sim5   (06.12.2008 в 02:19)   письмо автору
 
   для: Бамси   (06.12.2008 в 02:11)
 

Понял. Проверка на профпригодность контроллера CD и DVD дисков. )

PS. А исходный массив, это точно многомерный, или это вы его так прописали в примере?

  Ответить  
 
 автор: Бамси   (06.12.2008 в 02:26)   письмо автору
 
   для: sim5   (06.12.2008 в 02:19)
 

Угу и этикеточки в коробочки засовывать.

Это я его так прописал.
Я просто не представляю как матрица не может быть многомерной.

  Ответить  
 
 автор: sim5   (06.12.2008 в 02:39)   письмо автору
 
   для: Бамси   (06.12.2008 в 02:26)
 

Матрица да, я к тому, что может быть требовалось одномерный массив (да просто последовательность) разложить N*N. Сейчас подумаем.

  Ответить  
 
 автор: BinLaden   (06.12.2008 в 03:22)   письмо автору
 
   для: sim5   (06.12.2008 в 02:39)
 

Кто выложит самое короткое решение, тому cheops автомобиль подарит -- новая тема для раздела задач!

  Ответить  
 
 автор: sim5   (06.12.2008 в 03:24)   письмо автору
 
   для: BinLaden   (06.12.2008 в 03:22)
 

Это смотря какой автомобиль, если "Запорожец", то обязательно прийму участие - давно мечтал о таком. :)

  Ответить  
 
 автор: Бамси   (06.12.2008 в 03:46)   письмо автору
 
   для: sim5   (06.12.2008 в 03:24)
 

Я начинал делать что-то типо бесконечного цыкла, и просто доходя до края массива он изменял направление, а пройденные части матрицы заменял допустим на x. И когда встречал ичейку x то меня л направление. Ну и понятное дело когда во все стороны была ячейка x, то он прекращал цыкл.
Но это такой код получается... у...

  Ответить  
 
 автор: sim5   (06.12.2008 в 04:16)   письмо автору
 
   для: Бамси   (06.12.2008 в 03:46)
 

Нет, у меня другая идея, сейчас подумаю как выгоднее сделать.

  Ответить  
 
 автор: xx77   (06.12.2008 в 05:42)   письмо автору
 
   для: 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);
?>

  Ответить  
 
 автор: sim5   (06.12.2008 в 08:08)   письмо автору
 
   для: xx77   (06.12.2008 в 05:42)
 

Не всегда будет правильно.

  Ответить  
 
 автор: Бамси   (06.12.2008 в 19:19)   письмо автору
 
   для: 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

  Ответить  
 
 автор: Trianon   (06.12.2008 в 19:35)   письмо автору
 
   для: Бамси   (06.12.2008 в 19:19)
 

а как её решил претендент ?

  Ответить  
 
 автор: Бамси   (06.12.2008 в 19:37)   письмо автору
 
   для: Trianon   (06.12.2008 в 19:35)
 

Буду на месте - выложу свой вариант.
Но там тупо в лоб по методу, который я описывал выше.

  Ответить  
 
 автор: xx77   (06.12.2008 в 19:40)   письмо автору
 
   для: Бамси   (06.12.2008 в 19:19)
 

count($string)<12 имелось ввиду (ширина*высота) вместо 12

вы заменяли это в цикле while ?
( попробовать некогда, главное-же сам процесс придумывания :))

  Ответить  
 
 автор: sim5   (07.12.2008 в 06:03)   письмо автору
 
   для: xx77   (06.12.2008 в 19:40)
 

У вас, если будет матрица, например, 3 х 4, то на выходе будет лишний элемент, 3 х 5, уже 2 элемента лишних.

  Ответить  
 
 автор: Trianon   (06.12.2008 в 19:37)   письмо автору
 
   для: xx77   (06.12.2008 в 05:42)
 

не нужен здесь массив.

  Ответить  
 
 автор: xx77   (06.12.2008 в 19:52)   письмо автору
 
   для: Trianon   (06.12.2008 в 19:37)
 

Всмысле второй ?
Вначале так и хотел проверять в цикле strlen($string)<12
и добавлять $string .= array[y][x] но как-уж вышло ,)
а если эта матрица не массив , то в ней больше елементов
, те-же например переносы строк, или как ещё можно было представить эти числа
чтобы работать с ними?

  Ответить  
 
 автор: Trianon   (06.12.2008 в 19:59)   письмо автору
 
   для: xx77   (06.12.2008 в 19:52)
 

ни один не нужен.

  Ответить  
 
 автор: Бамси   (07.12.2008 в 17:43)   письмо автору
 
   для: Бамси   (06.12.2008 в 00:11)
 

Еще варианты решения будут?

  Ответить  
 
 автор: Лена   (07.12.2008 в 18:01)   письмо автору
 
   для: Бамси   (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;
?>


Только это по часовой стрелке матрица заполняется. Если против часовой, как у вас, пока не не получается вывести в обратном порядке(если сначала строки, потом стобцы уменьшаются), условие для двух внутренних циклов не могу поставить.
Смысл в том, что есть четыре состояния, при которых либо меняется индекс рядов, а строки остаются на месте, либо меняются строки, а номер ряда - тот же самый. Нарисуйте матрицу самую простую - у нее четыре стороны, значит, состояний(циклов) тоже четыре, которые находятся внутри общего цикла. Не знаю, как объяснить понятней.

  Ответить  
 
 автор: sim5   (07.12.2008 в 18:01)   письмо автору
 
   для: Бамси   (07.12.2008 в 17:43)
 

У меня было две, вот только руки до них не дошли - пообщал за выходные собрать из двух старых компов один и отремонтировать принтер. Думал успею быстро, но... еще с компом не все до конца, и плюс на принтере памперс нужно сменить. Поэтому не запускал Денвера и... Идеи следующие. Первая, берем первую колонку и последнюю строку и крайнюю колонку и первую строку, приближаясь постоянно к центру матрицы. Тоже самое, что вам предлагали выше, но только направление определяется четностью итерации цикла и будет меньше вложенных циклов (по идее). Вторая идея практически как и первая, только меняется не направление считывания, а реверсируется полученное колонки и строки (правой колонки и верхних строк), что также определяется четностью итерации цикла.

  Ответить  
 
 автор: Бамси   (07.12.2008 в 22:47)   письмо автору
 
   для: Бамси   (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;

?>

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования