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

Форум PHP

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Задачка: распечатка матрицы по спирали

Сообщения:  [1-10]    [11-20]  [21-26] 

 
 автор: Бамси   (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;

?>

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

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

  Ответить  
 
 автор: Лена   (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;
?>


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  Ответить  

Сообщения:  [1-10]    [11-20]  [21-26] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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