За последние 24 часа нас посетили 17736 программистов и 1702 робота. Сейчас ищут 972 программиста ...

Поиск элементов в матрице

Тема в разделе "PHP для новичков", создана пользователем mattxs, 26 апр 2015.

  1. mattxs

    mattxs Новичок

    С нами с:
    8 мар 2015
    Сообщения:
    13
    Симпатии:
    0
    Доброй ночи. Имеется функция
    Код (Text):
    1.  
    2. function is_existELEM($X)
    3.     {
    4.         $K = array();
    5.         for ($q=0; $q < count($X); $q++) {
    6.             for ($z=0; $z < count($X[0]); $z++) {
    7.                 $K[$q][$z] = -1;
    8.             }
    9.         }
    10.  
    11.         $s = false;
    12.         $t = false;
    13.  
    14.         for ($i=0; $i < count($X); $i++) {
    15.             for ($j=0; $j < count($X[0]); $j++) {
    16.                 if($X[$i][$j]==-1) continue;
    17.                 else
    18.                 {
    19.                     $k=$i;
    20.                     $l=$j;
    21.                 //  do{
    22.                         for ($k=0; $k < count($X[0]); $k++) {
    23.                             if($X[$i][$k] != -1) $s = true;
    24.                             else $s = false;
    25.                         }
    26.                 //      $f++;
    27.                 //  } while($f<count($X[0]));
    28.  
    29.                 //  do{
    30.                         for ($l=0; $l < count($X); $l++) {
    31.                             if($X[$l][$j] != -1) $t = true;
    32.                             else $t = false;
    33.                         }
    34.                 //      $d++;
    35.                 //  } while($d<count($X));
    36.  
    37.  
    38.                     if($s && $t) $K[$i][$j] = $X[$i][$j];
    39.                     else $X[$i][$j]=-1;
    40.                     printmatrix($X);
    41.                     echo "<br><br>";
    42.                 }
    43.             }
    44.         }
    45.         return $K;
    46.     }
    Но работает она не совсем правильно.
    Подскажите,пожалуйста. У меня есть двумерный массив:
    Код (Text):
    1.  
    2. $X = array(
    3.             array(90,-1,20),
    4.             array(-1,300,100),
    5.             array(50,-1,60)
    6.         );
    Необходимо пройти по матрице пропуская -1 и для каждого элемента (не равного -1) проверить, есть ли ещё элементы в строке и столбце не равные -1. Если есть, то записать элемент (для которого искали) в дв. массив $K. Иначе приравнять этот элемент (для которого искали) к -1, то есть $X[$i][$j]=-1 и перейти к следующему элементу.
    Например если матрица $X такая:
    Код (Text):
    1.  
    2. $X = array(
    3.             array(90,-1,20),
    4.             array(-1,300,100),
    5.             array(50,-1,60)
    6.         );
    то первый элемент на пути (не равный -1) будет 90. Для 90 надо проверить, есть ли на этой строке хоть один элемент не равный -1 И так же на столбце, где стоит 90. В нашем случае, на строке стоит 20, на столбце 50, следовательно, запоминаем 90 (с теми же индексами) в массив $K, то есть $K[$i][$j]=$X[$i][$j] и переходим к следующему элементу. Следующий элемент 20 (для него на строке стоит 90, на столбце 100 и 60), следовательно запоминаем. Далее 300, на строке 100, а на столбце нету элемента неравного -1, следовательно присваиваем 300 значение -1, то есть $X[$i][$j]=-1; Далее 100, на столбце 20 и 60, а на строке НЕТ элементов,так как 300 уже стал -1 на предыдущем шаге цикла. И тд. На выходе должен получиться массив $K вида
    Код (Text):
    1.  
    2. $X = array(
    3.             array(90,-1,20),
    4.             array(-1,-1,-1),
    5.             array(50,-1,60)
    6.         );
    Проблема в том, что не могу понять, как двинуть цикл назад, если, например, мы на элементе 20 в $X как понять, что для него на строке есть 90. Или на элементе 60, как понять, что для 60 на строке есть 50, а на столбце 20.
    Буду рад любой помощи! Спасибо!
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    А ты когда вручную проверяешь матрицу, то как двигаешь цикл назад? По каким параметрам? Может запомнил значение, или арифметической операцией понял куда смотреть.
    Возможно тут не всё учтено:
    Попробуй по шагам тестовую матрицу описать по алгоритму, а то мало что понятно.
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    А вы циклы в коде просто так что-ли ставите, чтоб было?
     
  4. mattxs

    mattxs Новичок

    С нами с:
    8 мар 2015
    Сообщения:
    13
    Симпатии:
    0
    Решил попробовать таким способом:
    иду по матрице $x, если количество элементов (не равных -1) в строке и столбце >=2 и то запоминаю элемент $x[j], а если нет, то приравниваю его к -1, но что-то не получается..

    Код (Text):
    1.  
    2. function is_existELEM($X)
    3.     {
    4.         $K = array();
    5.         for ($q=0; $q < count($X); $q++) {
    6.             for ($w=0; $w < count($X[0]); $w++) {
    7.                 $K[$q][$w] = -1;
    8.             }
    9.         }
    10.  
    11.         $as=0;
    12.         $sa=0;
    13.  
    14.         $s = false;
    15.         $t = false;
    16.  
    17.        
    18.  
    19.        
    20.  
    21.         for ($i=0; $i < count($X); $i++) {
    22.             for ($j=0; $j < count($X[0]); $j++) {
    23.                 if($X[$i][$j]==-1) continue;
    24.                 else
    25.                 {
    26.                    
    27.                
    28.                         for ($ki=$X[$i][0]; $ki < 1; $ki++) {
    29.                             for($kj=0;$kj<count($X[0]);$kj++)
    30.                             {
    31.                                 if($X[$ki][$kj]!=-1) $as++;
    32.                                 if($as >= 2) $s = true;
    33.                                 else $s = false;
    34.                             }
    35.                         }
    36.                
    37.                         for ($ik=$X[$i][0]; $ik < count($X); $ik++) {
    38.                             for($jk=0;$jk<1;$jk++)
    39.                             {
    40.                                 if($X[$ik][$jk]!=-1) $sa++;
    41.                                 if($sa >= 2) $t = true;
    42.                                 else $t = false;
    43.                             }
    44.                         }
    45.                
    46.  
    47.                     if($s && $t) $K[$i][$j] = $X[$i][$j];
    48.                     else $X[$i][$j]=-1;
    49.                     printmatrix($X);
    50.                     echo "<br><br>";
    51.                 }
    52.             }
    53.         }
    54.         return $K;
    55.     }
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    У вас логике в коде очень мало. Напишите русским языком по шагам, как должен работать алгоритм. Или нарисуйте блоксхему.