Доброй ночи. Имеется функция Код (Text): function is_existELEM($X) { $K = array(); for ($q=0; $q < count($X); $q++) { for ($z=0; $z < count($X[0]); $z++) { $K[$q][$z] = -1; } } $s = false; $t = false; for ($i=0; $i < count($X); $i++) { for ($j=0; $j < count($X[0]); $j++) { if($X[$i][$j]==-1) continue; else { $k=$i; $l=$j; // do{ for ($k=0; $k < count($X[0]); $k++) { if($X[$i][$k] != -1) $s = true; else $s = false; } // $f++; // } while($f<count($X[0])); // do{ for ($l=0; $l < count($X); $l++) { if($X[$l][$j] != -1) $t = true; else $t = false; } // $d++; // } while($d<count($X)); if($s && $t) $K[$i][$j] = $X[$i][$j]; else $X[$i][$j]=-1; printmatrix($X); echo "<br><br>"; } } } return $K; } Но работает она не совсем правильно. Подскажите,пожалуйста. У меня есть двумерный массив: Код (Text): $X = array( array(90,-1,20), array(-1,300,100), array(50,-1,60) ); Необходимо пройти по матрице пропуская -1 и для каждого элемента (не равного -1) проверить, есть ли ещё элементы в строке и столбце не равные -1. Если есть, то записать элемент (для которого искали) в дв. массив $K. Иначе приравнять этот элемент (для которого искали) к -1, то есть $X[$i][$j]=-1 и перейти к следующему элементу. Например если матрица $X такая: Код (Text): $X = array( array(90,-1,20), array(-1,300,100), array(50,-1,60) ); то первый элемент на пути (не равный -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): $X = array( array(90,-1,20), array(-1,-1,-1), array(50,-1,60) ); Проблема в том, что не могу понять, как двинуть цикл назад, если, например, мы на элементе 20 в $X как понять, что для него на строке есть 90. Или на элементе 60, как понять, что для 60 на строке есть 50, а на столбце 20. Буду рад любой помощи! Спасибо!
А ты когда вручную проверяешь матрицу, то как двигаешь цикл назад? По каким параметрам? Может запомнил значение, или арифметической операцией понял куда смотреть. Возможно тут не всё учтено: Попробуй по шагам тестовую матрицу описать по алгоритму, а то мало что понятно.
Решил попробовать таким способом: иду по матрице $x, если количество элементов (не равных -1) в строке и столбце >=2 и то запоминаю элемент $x[j], а если нет, то приравниваю его к -1, но что-то не получается.. Код (Text): function is_existELEM($X) { $K = array(); for ($q=0; $q < count($X); $q++) { for ($w=0; $w < count($X[0]); $w++) { $K[$q][$w] = -1; } } $as=0; $sa=0; $s = false; $t = false; for ($i=0; $i < count($X); $i++) { for ($j=0; $j < count($X[0]); $j++) { if($X[$i][$j]==-1) continue; else { for ($ki=$X[$i][0]; $ki < 1; $ki++) { for($kj=0;$kj<count($X[0]);$kj++) { if($X[$ki][$kj]!=-1) $as++; if($as >= 2) $s = true; else $s = false; } } for ($ik=$X[$i][0]; $ik < count($X); $ik++) { for($jk=0;$jk<1;$jk++) { if($X[$ik][$jk]!=-1) $sa++; if($sa >= 2) $t = true; else $t = false; } } if($s && $t) $K[$i][$j] = $X[$i][$j]; else $X[$i][$j]=-1; printmatrix($X); echo "<br><br>"; } } } return $K; }
У вас логике в коде очень мало. Напишите русским языком по шагам, как должен работать алгоритм. Или нарисуйте блоксхему.