Форум программистов, компьютерный форум CyberForum.ru

Седловая точка - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.63
senechka_93
1 / 1 / 0
Регистрация: 11.05.2012
Сообщений: 15
12.05.2012, 14:08     Седловая точка #1
Элемент матрицы назовем седловой точкой, если он является наименьшим в своей своей строке и одновременно наибольшим в своем столбце или, наоборот, является наибольшим в своей строке и наименьшим в своем столбце. Для заданной матрицы nXm (где n, m - константы) напечатать индексы всех ее седловых точек.
Вот код программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <stdio.h>
#include <conio.h>
 
int const max_widht=3;
int const max_height=3;
 
void main()
{   
    int i,j, max, min, val;
    int m[max_widht][max_height]={
    {8,2,3},
    {-1,0,-1},
    {9,77,34}
    };
    int max_w[max_widht], min_w[max_widht], max_h[max_height], min_h[max_height];
 
for (i=0; i<max_widht; i++)
    {
        for (j=0; j<max_height; j++)
        {
          printf("%4d", m[i][j]);
        }
        printf ("\n");
    }
 
for (i=0; i<max_widht; i++)
{
    max=min=m[i][0];
    for (j=1; j<max_height; j++)
    {
        val=m[i][j];
        (val<min)? min=val : 0;
        (val>max)? max=val :0;  
    }
 max_w[i]=max;
 min_w[i]=min;
 
}
 
for (j=0; j<max_height; j++)
{
    max=min=m[0][j];
    for (i=1; i<max_widht; i++)
    {
        val=m[i][j];
        (val<min)? min=val : 0;
        (val>max)? max=val :0;  
    }
 max_h[j]=max;
 min_h[j]=min;
 
}
 
for ( i= 0; i<max_widht; i++ ) 
{
 
    for ( j= 0; j<max_height; j++ ) 
{
   if ( m[i][j] == max_w[i] && m[i][j] == min_h[j] || m[i][j] == min_w[i] && m[i][j] == max_h[j]) 
   {
 
      printf( "m[%d][%d]=%d\n", i, j, m[i][j] );
   }
 
}
}
 
 
 
_getch();
}
Возможно ли объединить 2 цикла for(поиск максимума и минимума в строке и столбце) в одну функцию? Если да, то как?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.05.2012, 14:08     Седловая точка
Посмотрите здесь:

C++ Седловая точка
C++ Седловая точка
удалить из каждой группы идущих подряд цифр, которой не предшествует точка, все начальные нули (кроме последнего, если за ним идет точка) C++
Дана точка М(x, y). Присвоить z = 1, если точка принадлежит окружности с радиусом R и центром в точке (a, b) и z = 0 в противном случае. C++
C++ Даны отрезки [a, b] и [c, d] и точка A с координатой х. Определить, принадлежит ли данная точка одному из этих отрезков, обоим или лежит вне их
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
12.05.2012, 15:20     Седловая точка #2
Кончено!!
Можно обойтись вообще без функций! правда это плохо.
Можно свернуть в 1 функцию, но не в 1 цикл (кроме случая n=m)
щас скину код (свой т.к ваше решение не очевидно)

Добавлено через 34 минуты
//Примечание: решение работает ПРАВИЛЬНО если в строке или столбце нет одинаковых элементов (Вам стоит добавить это в условие)
//Ваша функция - func();
//ЗЫ хачу лйак

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <fstream>
#include <algorithm>
#include <utility>
using namespace std;
//------------------
    const int n=3,m=3;
    int mas[n][m]={
    {8,2,3},
    {-1,0,-1},
    {9,77,34}
    };
    map <pair<int,int>,char> ans; // 1-minRow 2-maxRow 3-ans
//------------------
    void func(){
        for (unsigned int i=0;i<n;i++){
            int max=mas[i][0],min=mas[i][0];
            int MaxIndexX=0,MaxIndexY=0,MinIndexX=0,MinIndexY=0;
            for (unsigned int j=0;j<m;j++){
                if (mas[i][j]<min) {min=mas[i][j];MaxIndexX=i;MaxIndexY=j;};
                if (mas[i][j]>max) {max=mas[i][j];MinIndexX=i;MinIndexY=j;};
            };
         ans[make_pair(MaxIndexX,MaxIndexY)]=2;
         ans[make_pair(MinIndexX,MinIndexY)]=1;
        };
        for (unsigned int i=0;i<m;i++){
            int max=mas[0][i],min=mas[0][i];
            int MaxIndexX=0,MaxIndexY=0,MinIndexX=0,MinIndexY=0;
            for (unsigned int j=0;j<n;j++){
                if (mas[j][i]<min) {min=mas[j][i];MaxIndexX=j;MaxIndexY=i;};
                if (mas[j][i]>max) {max=mas[j][i];MinIndexX=j;MinIndexY=i;};
            };
        if (ans[make_pair(MaxIndexX,MaxIndexY)]==1) ans[make_pair(MaxIndexX,MaxIndexY)]=3;
        if (ans[make_pair(MinIndexX,MinIndexY)]==2) ans[make_pair(MinIndexX,MinIndexY)]=3;
        };
    };
//------------------
int main(){
    func();
    for (map <pair<int,int>,char>::iterator i=ans.begin();i!=ans.end();i++)
        if (i->second==3) cout<<i->first.first<<" "<<i->first.second<<endl;
    system("PAUSE");
    return 0;
};
senechka_93
1 / 1 / 0
Регистрация: 11.05.2012
Сообщений: 15
13.05.2012, 12:46  [ТС]     Седловая точка #3
Это конечно хорошо, но как мне просто объединить 2 цикла в 1 функцию, а потом 2 раза ее вызвать?
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
13.05.2012, 13:03     Седловая точка #4
Сейчас попробую, только вызовете вы её 1 раз

Добавлено через 13 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <stdio.h>
#include <conio.h>
 
int const max_widht=3;
int const max_height=3;
int i,j,max, min, val;
int max_w[max_widht], min_w[max_widht], max_h[max_height], min_h[max_height];
int m[max_widht][max_height]={
    {8,2,3},
    {-1,0,-1},
    {9,77,34}
    };
 
void func(){
    for (i=0; i<max_widht; i++)
{
    max=min=m[i][0];
    for (j=1; j<max_height; j++)
    {
        val=m[i][j];
        (val<min)? min=val : 0;
        (val>max)? max=val :0;  
    }
 max_w[i]=max;
 min_w[i]=min;
 
}
 
for (j=0; j<max_height; j++)
{
    max=min=m[0][j];
    for (i=1; i<max_widht; i++)
    {
        val=m[i][j];
        (val<min)? min=val : 0;
        (val>max)? max=val :0;  
    }
 max_h[j]=max;
 min_h[j]=min;
 
}
};
void main()
{   
 
for (i=0; i<max_widht; i++)
    {
        for (j=0; j<max_height; j++)
        {
          printf("%4d", m[i][j]);
        }
        printf ("\n");
    }
 
func();
 
for ( i= 0; i<max_widht; i++ ) 
{
 
    for ( j= 0; j<max_height; j++ ) 
{
   if ( m[i][j] == max_w[i] && m[i][j] == min_h[j] || m[i][j] == min_w[i] && m[i][j] == max_h[j]) 
   {
 
      printf( "m[%d][%d]=%d\n", i, j, m[i][j] );
   }
 
}
}
 
 
 
_getch();
}
//func (); теперь стоит на месте ваших циклов
//ЗЫ хачу ещё лайк
senechka_93
1 / 1 / 0
Регистрация: 11.05.2012
Сообщений: 15
13.05.2012, 13:06  [ТС]     Седловая точка #5
эти 2 цикла похожи, можно создать функцию, состоящую из 1 цикла, а потом 2 раза ее вызвать, изменив значения?
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
13.05.2012, 13:36     Седловая точка #6
Теперь понял, формулируйте лучше, сейчас накатаю

Добавлено через 15 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <stdio.h>
#include <conio.h>
 
int const max_width=3;
int const max_height=3;
int i,j,max, min, val;
int max_w[max_width], min_w[max_width], max_h[max_height], min_h[max_height];
int m[max_width][max_height]={
    {8,2,3},
    {-1,0,-1},
    {9,77,34}
    };
 
void func(bool how){
    int m1,m2;
    if (how) {m1=max_width;m2=max_height;}else {m1=max_width;m2=max_height;}
    for (i=0; i<m1; i++)
    {
        if (how) max=min=m[i][0]; else max=min=m[0][i];
        for (j=1; j<m2; j++)
        {
            if (how) val=m[i][j];else val=m[j][i];
            (val<min)? min=val : 0;
            (val>max)? max=val :0;  
        }
        if (how){
            max_w[i]=max;
            min_w[i]=min;
        }else{
            max_h[i]=max;
            min_h[i]=min;
        }
    }
};
void main()
{   
 
for (i=0; i<max_width; i++)
    {
        for (j=0; j<max_height; j++)
        {
          printf("%4d", m[i][j]);
        }
        printf ("\n");
    }
 
func(1);
func(0);
 
for ( i= 0; i<max_width; i++ ) 
{
 
    for ( j= 0; j<max_height; j++ ) 
{
   if ( m[i][j] == max_w[i] && m[i][j] == min_h[j] || m[i][j] == min_w[i] && m[i][j] == max_h[j]) 
   {
 
      printf( "m[%d][%d]=%d\n", i, j, m[i][j] );
   }
 
}
}
 
 
 
_getch();
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2012, 13:38     Седловая точка
Еще ссылки по теме:

Седловая точка C++
C++ Седловая точка в матрице
C++ Массивы. Седловая точка

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
senechka_93
1 / 1 / 0
Регистрация: 11.05.2012
Сообщений: 15
13.05.2012, 13:38  [ТС]     Седловая точка #7
спасииибо))
Yandex
Объявления
13.05.2012, 13:38     Седловая точка
Ответ Создать тему
Опции темы

Текущее время: 01:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru