Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

двумерные массивы(учёт границ ) C++

54K
09 января 2010 года
RomaJkaa
3 / / 08.01.2010
Элемент матрицы называется локальным минимумом, если он строго меньше всех имеющихся у него соседей. Подсчитать количество локальных минимумов заданной матрицы 10 на 10 .
Найти сумму модулей элементов выше главной диагонали.

Вопрос по первой части :
1)Что-то он криво считает минимумы в углах там вроде как нужен учёт границ только я не знаю как это сделать ((

Код:
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
int main(){
int k,j,i,m,n,loc_min,summ;
cout << endl << endl << "vvedite kolichestvo strok : ";
cin >> m;
cout << "vvedite kolichestvo stolbcov : ";
cin >> n;
int **a = new int *[m];
for ( i = 0 ; i < m ; i++){
        a = new int [n];
        }
for ( i = 0 ; i < m ; i++ ){
        for ( j = 0 ; j < n ; j++ )
                cin >> a[j];
        }
 
cout << endl << endl;
 
loc_min = 0;
summ = 0;
 
 
for ( i = 0 ; i < m ; i++ )
        {
        for ( j = 0 ; j < n ; j++ )
                {
                if( (i==0) && (j==0) && (a[j]<a[j+1]) && (a[j]<a[i+1][j]) && (a[j]<a[i+1][j+1]) )
                        loc_min = loc_min + 1;
                else
                        if( (a[j]<a[i-1][j-1]) && (a[j]<a[i-1][j]) && (a[j]<a[i-1][j+1]) && (a[j]<a[j-1]) && (a[j]<a[j+1]) && (a[j]<a[i+1][j-1]) && (a[j]<a[i+1][j]) && (a[j]<a[i+1][j+1]))
                                loc_min = loc_min + 1;
                }
        }
 
cout << endl;
cout << " colichestvo localnyx minimumov v matrice : " << loc_min;
 
for ( i = 0 ; i < m-1 ; i++ )
        {
       cout <<endl << summ;
        for ( j = 1 ; j < n ; j++ )
                {
if ( i+j < n )
if ( a[j+i] < 0 )
summ = summ - a[j+i];
else
summ = summ + a[j+i];
                }
        }
cout << " summa modulei elementov, raspol. vishe glavnoi diagonali : " << summ;
getchar();
87
09 января 2010 года
Kogrom
2.7K / / 02.02.2008
Цитата: RomaJkaa
только я не знаю как это сделать ((



Это потому, что ты отвлекаешься на ненужное. Не вводи массивы вручную каждый раз - сделай 2-3 тестовых массива. Так ты и своё время сэкономишь и помогающим облегчишь задачу.

Можно либо сделать "бордюр" из максимумов вокруг массива, если известен максимум (допустим, максимум для int), либо вынести проверку краёв в отдельные циклы, в котором условия на минимум немного изменить. Конечно можно написать хитрую проверку, учитывающую нахождение на краю, но это немного затормозит анализ.

12K
09 января 2010 года
Ghox
297 / / 26.07.2009
Цитата: RomaJkaa
Элемент матрицы называется локальным минимумом, если он строго меньше всех имеющихся у него соседей. Подсчитать количество локальных минимумов заданной матрицы 10 на 10 .
Найти сумму модулей элементов выше главной диагонали.

Вопрос по первой части :
1)Что-то он криво считает минимумы в углах там вроде как нужен учёт границ только я не знаю как это сделать ((


Проблема здесь:

Код:
for ( i = 0 ; i < m ; i++ )
        {
        for ( j = 0 ; j < n ; j++ )
                {
                if( (i==0) && (j==0) && (a[j]<a[j+1]) && (a[j]<a[i+1][j]) && (a[j]<a[i+1][j+1]) )
                        loc_min = loc_min + 1;
                else
                        if( (a[j]<a[i-1][j-1]) && (a[j]<a[i-1][j]) && (a[j]<a[i-1][j+1]) && (a[j]<a[j-1]) && (a[j]<a[j+1]) && (a[j]<a[i+1][j-1]) && (a[j]<a[i+1][j]) && (a[j]<a[i+1][j+1]))
                                loc_min = loc_min + 1;
                }
        }

Всего может быть 9 вариантов, когда у клетки может быть разное число и расположение соседних клеток: 4 - проверяемая клетка находится на одном из углов (и имеет 3 соседних), 4 - клетка находится на краю, но не на углу (имеет 5 соседних), и еще один - клетка находится не на углу и не на краю (8 соседних). У вас реализовано так, как будто есть всего 2 варианта. Если действовать тем, способом, какой вы пытаетесь использовать, то нужно рассматривать все 9 вариантов, что-то вроде такого:
Код:
for ( i = 0 ; i < m ; i++ )
{
        for ( j = 0 ; j < n ; j++ )
    {
        if( i == 0)
        {
            if( j == 0)
            {
                        if( (a[j]<a[j+1]) && (a[j]<a[i+1][j]) && (a[j]<a[i+1][j+1]) )
                                loc_min = loc_min + 1;
            }
            else if( j == n - 1)
            {
                if( /*условие*/ )
                    loc_min = loc_min + 1;
            }
            else // случай когда j > 0 && j < n - 1
            {
                if( /*условие*/ )
                    loc_min = loc_min + 1;                 
            }
        }
        else if( i == m - 1)
        {
            if( j == 0)
            {
                if( /*условие*/ )
                    loc_min = loc_min + 1;
            }
            else if( j == n - 1)
            {
                if( /*условие*/ )
                    loc_min = loc_min + 1;
            }
            else // случай когда j > 0 && j < n - 1
            {
                if( /*условие*/ )
                    loc_min = loc_min + 1;                 
            }
        }
        else // случай когда i > 0 && i < m - 1
        {
            if( j == 0)
            {
                if( /*условие*/ )
                    loc_min = loc_min + 1;
            }
            else if( j == n - 1)
            {
                if( /*условие*/ )
                    loc_min = loc_min + 1;
            }
            else // случай когда j > 0 && j < n - 1
            {
                if( /*условие*/ )
                    loc_min = loc_min + 1;                 
            }
        }
    }
}

Цитата: Kogrom
Конечно можно написать хитрую проверку, учитывающую нахождение на краю, но это немного затормозит анализ.


Попытался сделать пример такой хитрой проверки:

Код:
for ( i = 0 ; i < m ; i++ )
        for ( j = 0 ; j < n ; j++ )
    {
        bool is_loc_min = true;
        for ( int i1 = i - 1; i1 <= i + 1 && is_loc_min; ++i1 )
            for ( int j1 = j - 1; j1 <= j + 1 && is_loc_min; ++j1 )
                if(i1 >= 0 && i1 < m && j1 >= 0 && j1 < n && !(i1 == i && j1 == j))
                    is_loc_min = a[j] < a[i1][j1];
        if(is_loc_min)
            ++loc_min;
    }
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог