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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.11.2012, 17:34   #1
Madison_Strowlin
Новичок
Джуниор
 
Регистрация: 08.11.2012
Сообщений: 1
Сообщение двумерные массивы

Ребята помогите пожалуйста довести програмку до ума.
Задача заключается в следующем:Подсчитать количество локальных максимумов массива. Элемент массива является локальным максимумом, если он строго больше всех имеющихся у него соседей.
Я тут набросал немного, но она работает неправильно(
#include<stdio.h>
#include<conio.h>
#include<math.h>
main()
{int a[50][50],i,j,n,m,num=0,k,c,f,z;

printf("Vvedite n&m\n");
scanf("%d%d",&n,&m);
printf("\nVvedite massiv\n");
for (i=0;i<n;i++)
for (j=0;j<m;j++)
{printf("a[%d][%d]=",i,j);
scanf("%d",&a[i][j]);}
for (i=0;i<n;i++)
{k=++i; c=--i;
if(c<0) continue;

for (j=0;j<m;j++)
{
f=++j; z=--j;
if(z<0) continue;
if(a[i][j]>a[c][j])
if(a[i][j]>a[i][z])
if(a[i][j]>a[k][j])
if(a[i][j]>a[i][f])
if(a[i][j]>a[c][z])
if(a[i][j]>a[c][f])
if(a[i][j]>a[k][z])
if(a[i][j]>a[k][f])
num=num+1;
else printf("Error!");
}
}
printf("Num=%d",num);
getch();
}
Помогите пожалуйста, буду очень благодарен
Madison_Strowlin вне форума Ответить с цитированием
Старый 08.11.2012, 18:23   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Попробуйте так:
Код:
for (i = 1; i < n - 1; ++i) {
    for (j = 1; j < m - 1; ++j) {
        if (a[i][j] > a[i - 1][j] &&
            a[i][j] > a[i + 1][j] &&
            a[i][j] > a[i - 1][j - 1] &&
            a[i][j] > a[i][j - 1] &&
            a[i][j] > a[i + 1][j - 1] &&
            a[i][j] > a[i - 1][j + 1] &&
            a[i][j] > a[i][j + 1] &&
            a[i][j] > a[i + 1][j + 1]) {
            ++num;
        }
    }
}
Используйте кнопочку # для оформления кода.
Можно было сделать через циклы (еще 2 вложенных), но мне лень
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 08.11.2012, 18:25   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

В следующих строках не должно меняться i:
Код:
k=++i; c=--i;
...
f=++j; z=--j;
Вместо них должно быть:
Код:
k=i+1; c=i-1;
...
f=j+1; z=j-1;
Проверки, которые приводят к continue - неправильны в корне и бесполезны.

Я бы упростил следующим образом: создал вокруг матрицы "барьер".
Поясняю на матрице 3х3:
00000
01230
02340
03450
00000
т.е. матрица получается не NxM, а (N+2)x(M+2). Заполняем крайние значение минимальным значением (в данном случае я написал ноль, но нужно заполнять минимальным значением для типа int, т.е. отрицательное длинное число). Эта штука позволит работать с краевыми значениями как со всеми остальными и проверок будет меньше (всегда будет восемь соседей и не нужно беспокоиться о выходе за границы выделенной под массив памяти). "Полезная" матрица, соответственно, будет начинаться с элемента с индексами [1,1], а не с нулей, как обычно.
Так же советую почитать про && и перестать писать вложенные if'ы.
Цитата:
Сообщение от BDA Посмотреть сообщение
Попробуйте так
Не проверяются на локальную максимальность угловые и прочие "краевые" элементы, а они, по идее, тоже должны участвовать.

Последний раз редактировалось pu4koff; 08.11.2012 в 18:27.
pu4koff вне форума Ответить с цитированием
Старый 08.11.2012, 18:33   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

pu4koff, Вы правы, действительно краевые не проверяются, но сделано это умышленно.
Тогда можно сделать так, например:
Код:
for (i = 0; i < n; ++i) {
    for (j = 0; j < m; ++j) {
        int tmp = 1;
        for (q = max(0, i - 1); q < min(n, i + 1) && tmp; ++q) {
            for (k = max(0, j - 1); k < min(m, j + 1) && tmp; ++k) {
                if (i != q && j != k && a[i][j] <= a[q][k]) tmp = 0;
            }
        }
        num += tmp;
    }
}
(Требует тестирования)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Одномерные массивы, двумерные массивы, строки Sand093 C++ Builder 11 20.05.2012 21:48
Двумерные массивы ZelFar Помощь студентам 4 06.03.2012 09:57
Двумерные массивы(матрица) 2)Строковые массивы(строки): 3)Структуры nuriyat Помощь студентам 1 21.01.2012 16:16
Двумерные массивы(массивы указателей на массивы) krytishka99 Помощь студентам 1 29.12.2011 19:51
Двумерные массивы 1Dima Помощь студентам 1 09.04.2011 15:54