Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Определить седловые точки матрицы. 
:(
    Опции темы
Endy
Дата 6.6.2010, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 6.6.2010

Репутация: нет
Всего: нет



Элемент матрицы является седловой точкой, если он является наименьшим в своей строке и наибольшим в своем столбце (или наоборот: наибольшим в своей строке и наименьшим в своем столбце). Для заданной матрицы определить все седловые точки.

Пояснение: Используя функции, решить указанную в варианте задачу. Массив должен передаваться в функцию как параметр. 

За раннее благодарю. smile  
PM MAIL   Вверх
JackYF
Дата 6.6.2010, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 2
Всего: 162



Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
darkart
Дата 10.6.2010, 04:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 379
Регистрация: 9.11.2005

Репутация: 26
Всего: 31



Наверное так, лучше проверить;)
Код

#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.: * в ответе означает, что точка не подходит
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0433 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.