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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Седловые точки 
V
    Опции темы
Azart11
Дата 21.9.2012, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




 
Код



#include <iostream>

using namespace std;
int main()
{

int i1,j1,i,j,n,m,i2,j2;

cout<<"vvedite chislo strok:=";
 cin>>n;
cout<<"vvedite chislo stolb:=";
 cin>>m;

float k[n][m],max,min;
for(i=0;i<n;i++)
 for(j=0;j<m;j++)
  cin>> k[i][j];

for(i=0;i<n;i++)
{
min=k[i][0];
i1=i;
j1=0;
for(j=1;j<m;j++)
if(k[i][j]<min)
{
min=k[i][j];
i1=i;
j1=j;
}
else if (min==k[i][j]) {cout<<"k["<<i<<"]["<<j<<"] min="<<min<<endl;}
cout<<"k["<<i1<<"]["<<j1<<"] min="<<min<<endl;
}


for(j=0;j<m;j++)
{
max=k[0][j];
i1=0;
j1=j;
for(i=1;i<n;i++)
if(max<k[i][j])
{
max=k[i][j];
i2=i;
j2=j;
}
else if (max==k[i][j]) {cout<<"k["<<i<<"]["<<j<<"] max="<<max<<endl;}
cout<<"k["<<i2<<"]["<<j2<<"] max="<<max<<endl;
}


return 0;
}



Это сообщение отредактировал(а) Azart11 - 30.9.2012, 14:02
PM MAIL   Вверх
borisbn
Дата 22.9.2012, 00:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



А где вопрос ?
Не указание участникам форума - сделайте мне эту домашку/курсовую/зачёт, а вопрос типа:
я сделал(а) по заданию так-то и так-то, а рез-т какой-то не такой.....

Цитата(Azart11 @  21.9.2012,  22:46 Найти цитируемый пост)
int i,j,a,b,f[a][b];

для начала...
здесь выделяется память под переменные i,j и под a, b все четыре типа int. Значение этим переменным никто не присваивает.
Затем выделяется массив f, размер которого равен a * b. Но, т.к. ни a, ни b никто не инициализировал, то размер этого f может быть какой угодно.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Azart11
Дата 22.9.2012, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(borisbn @ 22.9.2012,  00:18)
А где вопрос ?
Не указание участникам форума - сделайте мне эту домашку/курсовую/зачёт, а вопрос типа:
я сделал(а) по заданию так-то и так-то, а рез-т какой-то не такой.....

Цитата(Azart11 @  21.9.2012,  22:46 Найти цитируемый пост)
int i,j,a,b,f[a][b];

для начала...
здесь выделяется память под переменные i,j и под a, b все четыре типа int. Значение этим переменным никто не присваивает.
Затем выделяется массив f, размер которого равен a * b. Но, т.к. ни a, ни b никто не инициализировал, то размер этого f может быть какой угодно.

Выше моя программа, как совместить минимум и максимум в единую точку(седловую)
PM MAIL   Вверх
feodorv
Дата 23.9.2012, 06:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Azart11, Вам нужно всего лишь проверить 2 условия для каждого элемента:
  • элемент является минимумом в своей строке (меньше его в строке нет!)
  • элемент является максимумом в своем столбце (больше него в столбце нет!)
Это самый тупой алгоритм, который приходит в голову.
Код

for( int i=0; i<n; ++i)
  for( int j=0; j<m; ++j)
  {
     float val = k[i][j];
     int condition = 1;

     // is min in line?
     for( int row=0; row<m; ++row)
        if( row != j )
          if( val > k[i][row] )
          {
            condition = 0;
            break;
          }
     if( !condition ) continue;
       
     // is max in row?
     for( int line=0; line<n; ++line)
        if( line != i )
          if( val < k[line][j] )
          {
            condition = 0;
            break;
          }
     if( !condition ) continue;

     // имеем седловую точку k[i][j]
  }


Оптимизацией алгоритма можно заняться позже (если позволят время и знания).
И в Вашей версии поиска min/max элементов Вы не учитываете, что в строке матрицы может быть несколько минимальных элементов (с одинаковыми значениями), и, соответственно, в столбце - несколько максимальных. Вы можете потерять несколько "седловых точек", если будете считать, что min/max элементы единственны.

ЗЫ Большая просьба: в коде пользоваться пробелами, читать невозможно...


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Azart11
Дата 23.9.2012, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



как исправить мою программу, min ищет верно, а вот max само значение выдаёт правильно, но координаты не правильны.
1)Например: матрица n=2 и m=2
1   9
2   2

k[0;0] min=1
k[1;1] min=2
k[1;0] min=2
k[1;0] max=2
k[1;0] max=9 - здесь нужно k[0;1] max=9

2) или вот ещё матрица n=1  и m=3
k[0;0] min=1
k[ 1975749845][592945972]max=1 - должно быть k[0][0]max=1
k[ 1975749845][592945972]max=3 - должно быть k[0][1]max=3
k[ 1975749845][592945972]max=2 - должно быть k[0][2]max=2
PM MAIL   Вверх
feodorv
Дата 23.9.2012, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(Azart11 @  23.9.2012,  19:32 Найти цитируемый пост)
как исправить мою программу

Внимательно прочитать код.
Цитата(Azart11 @  21.9.2012,  23:46 Найти цитируемый пост)
for(j=0;j<m;j++)
{
max=k[0][j];
i1=0;
j1=j;

for(i=1;i<n;i++)
if(max<k[i][j])
{
max=k[i][j];
i2=i;
j2=j;
}




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Silent
Дата 24.9.2012, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Что-то мне предлагаемые решения совсем не нравятся, слишком сложные. Я бы решил задачу так - построил массив максимальных элементов по строкам, минимумы по столбцам, а потом пробежался по массиву, и если элемент k[i][j] равен max[j] и min[i] - то это седловая точка, всё про всё пара строчек, очень простых строчек:
Код

#include <stdio.h>

int n, m;

int main()
{
    scanf("%d %d",&n,&m);
    int k[n][m],
        min[n],
        max[m];
    for (int i = 0; i < n; i++) min[i] = 0x7FFFFFFF;    //инициализируем значением INT_MAX
    for (int j = 0; j < m; j++) max[j] = 0xFFFFFFFF;    //инициализируем значением INT_MIN
    for (int i = 0; i < n; i++) 
        for (int j = 0; j < m; j++)
        {
            scanf("%d",&k[i][j]);
            min[i] = (min[i] < k[i][j]) ? min[i] : k[i][j];
            max[j] = (max[j] > k[i][j]) ? max[j] : k[i][j];
        }
    //следующие 4 (четыре) строчки - решение задачи =)
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            if ((k[i][j] == min[i]) && (k[i][j] == max[j]))
                printf("k[%d][%d]=%d\n", i, j, k[i][j]);
    return 0;
}

PM MAIL   Вверх
borisbn
Дата 24.9.2012, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Silent, твой вариант не учитывает то, о чём говорил feodorv:
Цитата(feodorv @  23.9.2012,  06:33 Найти цитируемый пост)
в строке матрицы может быть несколько минимальных элементов (с одинаковыми значениями)

проверь на такой матрице
Цитата
20 30 40
10 10 10
20  5  6

выделенный элемент будет найден как седловая точка, а на самом деле это не так.

Это сообщение отредактировал(а) borisbn - 24.9.2012, 09:44


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
feodorv
Дата 24.9.2012, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Направление мысли с массивами min[] и max[] - верное)))

Цитата(Silent @  24.9.2012,  10:37 Найти цитируемый пост)
    //следующие 4 (четыре) строчки - решение задачи =)
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            if ((k[i][j] == min[i]) && (k[i][j] == max[j]))
                printf("k[%d][%d]=%d\n", i, j, k[i][j]);

Особого смысла сравнивать k[i][j] и min[i], а потом k[i][j] и max[j], нет. Достаточно просто сравнить min[i] и max[j] smile (То есть в завершающей фазе массив k вообще не нужен)))


Цитата(borisbn @  24.9.2012,  10:43 Найти цитируемый пост)
твой вариант не учитывает

Думаю, что учитывает, поскольку перебор в конце идет по всем столбцам и всем строкам smile 


Цитата(borisbn @  24.9.2012,  10:43 Найти цитируемый пост)
проверь на такой матрице

Не проверял, но верю smile Думаю, что подводит инициализация 
Цитата(Silent @  24.9.2012,  10:37 Найти цитируемый пост)
    for (int i = 0; i < n; i++) min[i] = 0x7FFFFFFF;    //инициализируем значением INT_MAX
    for (int j = 0; j < m; j++) max[j] = 0xFFFFFFFF;    //инициализируем значением INT_MIN

на 64 разрядной машине.

Но, должен заметить, автор топика пользуется float-значениями smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Silent
Дата 24.9.2012, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(borisbn @  24.9.2012,  09:43 Найти цитируемый пост)
выделенный элемент будет найден как седловая точка, а на самом деле это не так.

на всякий случай проверил, в матрице только одна седловая точка, выделенный элемент не считается седловым.
Да, автор использует float, а у меня int - но мое дело ведь показать, как можно решать, а не дать рабочий код, который можно идти сдавать преподавателю/начальнику. То же самое с инициализацией, подключайте limits.h (INT_MAX, INT_MIN), string.h (memset), подключайте boost'ы и прочие радости для кросплатформенной компиляции.  smile 
Я лишь ответил на вопрос "Как минимум и максимум совместить в седловую точку?"
PM MAIL   Вверх
borisbn
Дата 24.9.2012, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(Silent @  24.9.2012,  10:43 Найти цитируемый пост)
на всякий случай проверил, в матрице только одна седловая точка, выделенный элемент не считается седловым.

Ага. Я тоже - сначала написал не подумав, а потом проверил. Алгоритм на самом деле корректный. Сорри 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 24.9.2012, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(feodorv @  24.9.2012,  10:09 Найти цитируемый пост)
То есть в завершающей фазе массив k вообще не нужен

Ага! И даже более того, он вообще не нужен.  smile 

Код

int main()
{
    scanf("%d %d",&n,&m);
    int min[n];
    int max[m];
    for (int i = 0; i < n; i++) 
        for (int j = 0; j < m; j++)
        {
            int t;
            scanf("%d",&t);
            if (j==0 || min[i] > t) min[i] = t;
            if (i==0 || max[j] < t) max[j] = t;
        }
    //следующие 4 (четыре) строчки - решение задачи =)
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            if (max[j] == min[i])
                printf("k[%d][%d]=%d\n", i, j, max[j]);
    return 0;
}

PM MAIL   Вверх
feodorv
Дата 25.9.2012, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(volatile @  24.9.2012,  20:09 Найти цитируемый пост)
Ага! И даже более того, он вообще не нужен. 

 smile  smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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