Привет жителям Форума! Встала задача, определить седловые точки матрицы. Для Справки "элемент матрицы является «седловой точкой», если является одновременно максимальным в своей строке и минимальным в своем столбце" Так вот, есть массив со значениями. Нужно определить седловые точки. Как это можно сделать? Не могу сообразить. Кусок кода Код (Text): $filename = file("znat.txt"); //массивчик со значениями echo "<pre>"; print_r($filename); echo "<pre>";
Когда-то очень давно, такой вопрос поднимался, но искали решение того, как это сделать на Сях. Сейчас уже не вспомню, но если на php и решение "в лоб", то могу предложить такой вариант: Код (PHP): $matrix = array( array(3, 12, 5, 2), array(3, 14, 16, 12), array(1, 19, 10, 14) ); $maxL = array(); // максимальные значения в строках $lineCnt = count($matrix[0]); // кол-во значений в строке $tmpMin = array(); // временный массив для "разворота" матрицы на 90° foreach($matrix as $indx => $line){ $max = max($line); $maxL[$indx][array_search($max, $line)] = $max; for($i = 0; $i < $lineCnt; $i++){ $tmpMin[$i][$indx] = $matrix[$indx][$i]; } } $minC = array(); // минимальные значения в колонках foreach($tmpMin as $indx => $line){ $min = min($line); $minC[$indx][array_search($min, $line)] = $min; } $sp = array(); // массив где будут выведены седловые точки или "no", где они не найдены for($i = 0; $i < count($matrix); $i++){ for($k = 0; $k < $lineCnt; $k++){ if(isset($maxL[$i][$k],$minC[$k][$i])){ $sp[$i][$k] = $maxL[$i][$k]; } else { $sp[$i][$k] = 'no'; } } } print_r($sp); Нет времени рыскать по инету, но думаю, что для подобных задач, уже давно своё оптимальное колесо изобретено. Поэтому воспринимайте моё решение, как временное, пока вы не найдёте более достойное. P.S. Более оптимальное решение (вроде бы работает чуть-чуть быстрее), но принцип по сути - тот же: Код (PHP): function find_saddle_points($arr) { $points = array(); // проходимся по рядам матрицы foreach($arr as $i => $row) { // получем наибольшее значение из каждой строки $max = max($row); foreach($row as $j => $cell) { // только каждое максимальное значение // проверяем - является ли оно минимальным в колонке if($cell == $max && min_in_col($arr, $cell, $j)) { $points[$i][$j] = $arr[$i][$j]; } } } return $points ? $points : 'Седловых точек не найдено'; } function min_in_col($arr, $val, $col) { foreach($arr as $row) { // как только найдено хоть одно значение меньше - выходим if($val > $row[$col]) { return false; } } return true; } print_r( find_saddle_points($matrix) );