Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.12.2012, 21:07   #1
Tatyana64
Пользователь
 
Регистрация: 30.10.2012
Сообщений: 37
По умолчанию С++ Поиск седловых точек

Дана целочисленная прямоугольная матрица. Определить:
1) сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент;
2) Номера строк и столбцов всех седловых строк матрицы (матрица содержит седловую точку a[i][j], если a[i][j] является минимальным элементом в i-ой строке и максимальным в j-ом столбце. Мой код
Код:
#include <iostream>
#include <conio.h>


using namespace std;
int main()
{
int n,m;
cin >> n>> m; //ввод размерности массива
int i,j;
int **a=new int*[n]; 
for(i=0;i<n;i++) a[i]=new int[m];
  for(i=0;i<n;i++) 
  for(j=0;j<m;j++) cin >>a[i][j];   //ввод массива
int flag,summ;	 
summ=0; 
for(i=0;i<n;i++) 
{
  j=0; flag=0;
  while ((j<m) && (flag==0))
    if (a[i][j]<0) flag=1; else j++;
    if (flag==1)
      for(j=0;j<m;j++)
	{
	summ=summ+a[i][j];
	}
}
cout<<summ<<" ";
	//Поиск седловых точек
	int max=0,min=0,k;
	for(i=0;i<n;i++)
	{
		min=0;
		for(j=0;j<m;j++)
			if(a[i][j]<a[i][min]) min=j;
		max=1;
		for(k=0;k<n;k++)
			if(a[k][min]<a[max][min]) max=k;
		if(max==i) cout <<max+1 <<min+1;
	}
     system ("PAUSE");	
return 0;
}
Исходные данные
Размерность массива 5 6
элементы массива
2 1 3 5 1 4
-7 0 -6 4 -1 2
4 1 3 2 1 1
-3 -2 0 1 -2 2
1 0 0 3 0 9
Сумму считает правильно, а вот седловую точку находит только одну и то не то не ту
Помогите найти ошибку!
Tatyana64 вне форума Ответить с цитированием
Старый 01.12.2012, 21:59   #2
Tatyana64
Пользователь
 
Регистрация: 30.10.2012
Сообщений: 37
По умолчанию ?????????

может ошибка в коле?????????
Tatyana64 вне форума Ответить с цитированием
Старый 03.12.2012, 00:06   #3
Tatyana64
Пользователь
 
Регистрация: 30.10.2012
Сообщений: 37
По умолчанию Попробовала написать новый код

Код:
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <iomanip>
 
using namespace std;
int main()
{
int n,m,found=0,max[100][3], min[100][3];
cin >> n>> m; //ввод размерности массива
int i,j;
int **a=new int*[n]; 
for(i=0;i<n;i++) a[i]=new int[m];
  for(i=0;i<n;i++) 
  for(j=0;j<m;j++) cin >>a[i][j];   //ввод массива
int flag,summ;   
summ=0;
for(i=0;i<n;i++) 
{
  j=0; flag=0;
  while ((j<m) && (flag==0))
    if (a[i][j]<0) flag=1; else j++;
    if (flag==1)
      for(j=0;j<m;j++)
    {
    summ=summ+a[i][j];
    }
}
 
cout<<summ<<" ";
    //Поиск седловых точек
for (i=0;i<n;i++)
{
    min[i][0]=a[i][0];
    min[i][1]=i;
    min[i][2]=0;
    for (j=1;j<m;j++)
        if(a[i][j]<min[i][0]) 
        {
            min[i][0]=a[i][j];//сам минимум в i-ой строке
            min[i][1]=i; //строка минимума
            min[i][2]=j; //столбец минимума
        }
}
 
for (j=0;j<m;j++)
{
    max[j][0]=a[0][j];
    max[j][0]=0;
    max[j][0]=j;
    for (i=1;i<n;i++)
        if(a[i][j]>max[j][0]) 
        {
            max[j][0]=a[i][j];// сам максимум в j-ом столбце
            max[j][1]=i; //строка максимума
            max[j][2]=j; //столбец максимума
        }
}
for (i=0;i<n;i++)
    for (j=0;j<3;j++)
        cout <<min[i][j]<<" ";
cout <<endl;
for (i=0;i<n;i++)
    for (j=0;j<3;j++)
        cout <<max[i][j]<<" ";
for (i=0;i<n;i++)
    for (j=0;j<3;j++)
        if(min[i][0]==max[j][0] && min[i][1]==max[j][1] && min[i][2]==max[j][2])
        {   cout <<min[i][1]<<max[j][2];
        found++;}
 
     system ("PAUSE");  
return 0;
}
Но когда проверяю работоспособность кода (т.е формирую массивы min в строке и max в столбце "сам элемент", "его номер в строке" и "его номер в столбце" то выходит какая-то ерунда:
например размерность матрицы 3х3
0 -9 2
5 -1 0
1 -3 6
тогда массив min в строках будет такой:
-9 0 1
-1 1 1
-3 2 1
массив max в столбцах у меня получается
5 1 0
1 -858993460 -858993466
6 2 2

Подскажите откуда могли взяться эти большие отрицательные значения, если для других элементов она считает правильно
Tatyana64 вне форума Ответить с цитированием
Старый 08.12.2012, 22:21   #4
Tatyana64
Пользователь
 
Регистрация: 30.10.2012
Сообщений: 37
По умолчанию

Дана целочисленная прямоугольная матрица. Определить:
1) сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент;
2) Номера строк и столбцов всех седловых строк матрицы (матрица содержит седловую точку a[i][j], если a[i][j] является минимальным элементом в i-ой строке и максимальным в j-ом столбце.
Мой код
Код:
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <iomanip>
 
using namespace std;
int main()
{
int n,m,found=0,max[100][3], min[100][3];
cin >> n>> m; //ввод размерности массива
int i,j;
int **a=new int*[n]; 
for(i=0;i<n;i++) a[i]=new int[m];
  for(i=0;i<n;i++) 
  for(j=0;j<m;j++) cin >>a[i][j];   //ввод массива
int flag,summ;   
summ=0;
for(i=0;i<n;i++) 
{
  j=0; flag=0;
  while ((j<m) && (flag==0))
    if (a[i][j]<0) flag=1; else j++;
    if (flag==1)
      for(j=0;j<m;j++)
    {
    summ=summ+a[i][j];
    }
}
 
cout<<summ<<" ";
    //Поиск седловых точек
for (i=0;i<n;i++)
{
    min[i][0]=a[i][0];
    min[i][1]=i;
    min[i][2]=0;
    for (j=1;j<m;j++)
        if(a[i][j]<min[i][0]) 
        {
            min[i][0]=a[i][j];//сам минимум в i-ой строке
            min[i][1]=i; //строка минимума
            min[i][2]=j; //столбец минимума
        }
}
 
for (j=0;j<m;j++)
{
    max[j][0]=a[0][j];
    max[j][1]=0;
    max[j][2]=j;
    for (i=1;i<n;i++)
        if(a[i][j]>max[j][0]) 
        {
            max[j][0]=a[i][j];// сам максимум в j-ом столбце
            max[j][1]=i; //строка максимума
            max[j][2]=j; //столбец максимума
        }
}
for (i=0;i<n;i++)
    for (j=0;j<3;j++)
for (i=0;i<n;i++)
    for (j=0;j<3;j++)
for (i=0;i<n;i++)
    for (j=0;j<3;j++)
        if(min[i][0]==max[j][0] && min[i][1]==max[j][1] && min[i][2]==max[j][2])
        {   cout <<min[i][1]<<max[j][2];
        found++;}
 
     system ("PAUSE");  
return 0;
}
седловую точку находит но только первую, которая встречается в строке, а другие если они есть не находит, помогите проверьте код пожалуйста, видимо я что-то не так делаю
Tatyana64 вне форума Ответить с цитированием
Старый 08.12.2012, 22:55   #5
MihalNik
МегаМодератор
СуперМодератор
 
Регистрация: 27.11.2012
Сообщений: 5,669
По умолчанию

Что за нагромаждение циклов в конце?
Нужно что-то такое:
Код:
for (i=0;i<n;i++)
    for (j=0;j<m;j++)
        if(min[i][1]==max[j][1] && min[i][2]==max[j][2])
        {   cout <<min[i][1]<<min[i][2];
        found++;}
Вот только не ясно - а если в строке несколько минимумов (а в столбце несколько максимумов) - они будут являться седловыми точками или нет. В любом случае, Ваш алгоритм не учтет, например, два мин-ма в строке, где второй будет макс. в столбце, а первый - нет. Т.е. программа не корректна.
Если два минимума не считаются седловыми - нужно считать количество мин. элементов (проверка на равенство) в цикле.
Если считаются, нужно в повторном цикле по строкам сравнивать с мин. элементом, и при равенстве сразу же проверять элемент на макс. по столбцу вложенным циклом.
Благими намерениями устлана дорога на programmersforum.ru

Последний раз редактировалось MihalNik; 08.12.2012 в 23:07.
MihalNik вне форума Ответить с цитированием
Старый 08.12.2012, 23:34   #6
Tatyana64
Пользователь
 
Регистрация: 30.10.2012
Сообщений: 37
По умолчанию вот это мне и непонятно

Я попробовала но что-то у меня вообще ничего не получается!!!!!!
Tatyana64 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск седловых точек в двумерном массиве Артур_1993 Помощь студентам 4 28.11.2012 21:22
матризы определить индексы всех ее седловых точек Sylar9 Общие вопросы C/C++ 2 06.01.2012 16:09
Задаnm n точек. Найти m=3,4... точек и построить на них m-угольник: количество точек , лежащих внутри и вне его мин. различается L.Rain Помощь студентам 0 11.12.2011 22:19
определить радиус и центр окружности, на кот. лежит наиб.число точек заданного на плоскости мн-ва точек) kcю Помощь студентам 0 17.11.2009 19:50
Нахождение седловых точек ViNcHeStEr Помощь студентам 4 08.04.2009 18:42