Наверное так, лучше проверить;)
| Код | #include <iostream> using namespace std;
int** CreateIntMatrix( unsigned int rows, unsigned int cols ) { int** result = new int*[ rows ]; for( int i = 0; i < rows; i++ ) result[ i ] = new int[ cols ]; return result; }
void DestroyIntMatrix( int** matrix, int rows ) { for( int i = 0; i < rows; i++ ) delete[] matrix[ i ]; delete[] matrix; }
bool** CreateBoolMatrix( unsigned int rows, unsigned int cols ) { bool** result = new bool*[ rows ]; for( int i = 0; i < rows; i++ ) result[ i ] = new bool[ cols ]; return result; }
void InitBoolMatrix( bool** matrix, int rows, int cols ) { for( int i = 0; i < rows; i++ ) for( int j = 0; j < cols; j++ ) matrix[ i ][ j ] = false; }
void DestroyBoolMatrix( bool** matrix, int rows ) { for( int i = 0; i < rows; i++ ) delete[] matrix[ i ]; delete[] matrix; }
void InputMatrix( int** matrix, int rows, int cols ) { for( int i = 0; i < rows; i++ ) for( int j = 0; j < cols; j++ ) cin >> matrix[ i ][ j ]; }
void PrintMatrix( int** matrix, int rows, int cols ) { for( int i = 0; i < rows; i++ ) { for( int j = 0; j < cols - 1; j++ ) cout << matrix[ i ][ j ] << " "; cout << matrix[ i ][ cols - 1] << endl; } } //функция возвращает маску седловых точек матрицы matrix bool** GetMatrixPoints( int** matrix, int rows, int cols ) { bool** minRmaxC = CreateBoolMatrix( rows, cols );//маска для седловых точек из элементов минимальных в строке и максимальных в столбце InitBoolMatrix( minRmaxC, rows, cols );//инициализация - false
bool** maxRminC = CreateBoolMatrix( rows, cols );//маска для седловых точек из элементов максимальных в строке и минимальных в столбце InitBoolMatrix( maxRminC, rows, cols );//инициализация - false
int min, max;//минимальный и максимальный элементы
//в цикле ищем минимальные элементы строк и запоминаем их в маске for( int i = 0; i < rows; i++ ) { min = matrix[ i ][ 0 ];
for( int j = 1; j < cols; j++ ) if( matrix[ i ][ j ] < min ) min = matrix[ i ][ j ];
for( int j = 0; j < cols; j++ ) minRmaxC[ i ][ j ] = matrix[ i ][ j ] == min; }
//в цикле ищем максимальные элементы столбцов, пересекающиеся с минимальными элементами строк for( int j = 0; j < cols; j++ ) { max = matrix[ 0 ][ j ];
for( int i = 1; i < rows; i++ ) if( matrix[ i ][ j ] > max ) max = matrix[ i ][ j ];
for( int i = 0; i < rows; i++ ) minRmaxC[ i ][ j ] = minRmaxC[ i ][ j ] && ( matrix[ i ][ j ] == max ); } //в цикле ищем максимальные элементы строк и запоминаем их в маске for( int i = 0; i < rows; i++ ) { max = matrix[ i ][ 0 ];
for( int j = 1; j < cols; j++ ) if( matrix[ i ][ j ] > max ) max = matrix[ i ][ j ];
for( int j = 0; j < cols; j++ ) maxRminC[ i ][ j ] = matrix[ i ][ j ] == max; } //в цикле ищем минимальные элементы столбцов, пересекающиеся с максимальными элементами строк for( int j = 0; j < cols; j++ ) { min = matrix[ 0 ][ j ];
for( int i = 1; i < rows; i++ ) if( matrix[ i ][ j ] < min ) min = matrix[ i ][ j ];
for( int i = 0; i < rows; i++ ) maxRminC[ i ][ j ] = maxRminC[ i ][ j ] && ( matrix[ i ][ j ] == min ); } //ищем пересечение двух масок-множеств и запоминаем, например в первой маске for( int i = 0; i < rows; i++ ) for( int j = 0; j < cols; j++ ) minRmaxC[ i ][ j ] = minRmaxC[ i ][ j ] || maxRminC[ i ][ j ];
//освобождаем память второго множества-маски DestroyBoolMatrix( maxRminC, rows );
return minRmaxC;//возвращаем маску-результат седловых точек матрицы matrix } //функция печати седловых точек матрицы matrix по маске mask void PrintMatrixPoints( int** matrix, bool** mask, int rows, int cols ) { for( int i = 0; i < rows; i++ ) { for( int j = 0; j < cols - 1; j++ ) { mask[ i ][ j ]? cout << matrix[ i ][ j ] : cout << "*"; cout << " "; } mask[ i ][ cols - 1 ]? cout << matrix[ i ][ cols - 1 ] : cout << "*"; cout << endl; } }
int main( int argc, char* argv[] ) { int rows, cols;
//количество строк cout << "Please enter rows:" << endl; cin >> rows;
//количество столбцов cout << "Please enter columns:" << endl; cin >> cols;
int** matrix = CreateIntMatrix( rows, cols );//создаем матрицу нужного размера
cout << "Please enter matrix(" << rows << "x" << cols << "):" << endl; InputMatrix( matrix, rows, cols );//ввод
cout << "Source matrix:" << endl; PrintMatrix( matrix, rows, cols );//печать
bool** mask = GetMatrixPoints( matrix, rows, cols );//получаем седловые точки
cout << "Matrix points:" << endl; PrintMatrixPoints( matrix, mask, rows, cols );//печатаем седловые точки матрицы
//очищаем память DestroyBoolMatrix( mask, rows ); DestroyIntMatrix( matrix, rows );
return 0; }
|
P.S.: * в ответе означает, что точка не подходит |