Консультация № 189294
02.05.2016, 22:20
0.00 руб.
0 3 1
Уважаемые эксперты! Пожалуйста, помогите написать программу на Си:
Элемент матрицы называется локальным минимумом, если он строго меньше всех имеющихся у него соседей. Написать функцию возвращающую количество локальных минимумов заданной прямоугольной матрицы.


Обсуждение

давно
Посетитель
7438
7205
03.05.2016, 00:03
общий
Адресаты:
Соседи - только по горизонтали и вертикали?
Или, может быть, еще и по диагонали?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399292
22
03.05.2016, 03:51
общий
Адресаты:
В задании не уточнялось, думаю, можно ограничиться только по горизонтали и вертикали
давно
Посетитель
7438
7205
03.05.2016, 22:04
общий
это ответ
Здравствуйте, YarLam125!
Можно сделать, например, так:
[code h=200]
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <malloc.h>

#define M 7
#define N 6

int** MakeArray(int rows, int columns)
{
int **A = (int**)malloc(rows*sizeof(int));
for(int i=0; i<rows; i++)
{
A[i] = (int*)malloc(columns*sizeof(int));
for(int j=0; j<columns; j++)
A[i][j] = rand()%100;
}
return A;
}

void PrintArray(int** A, int rows, int columns)
{
for(int i=0; i<rows; i++)
{
for(int j=0; j<columns; j++)
printf("%4d ", A[i][j]);
printf("\n");
}
}

//Подсчет локальных минимумов
//Проходим по всем элементам матрицы
//и сравниваем со всеми соседями, если они есть!
//для этого проверяем граничное условие для индексов
//инкремент счетчика произойдет, только если будут выполнены четыре условия
//иначе - на анализ следующего элемента массива
int CalcLocalsMinimums(int** A, int rows, int columns)
{
int count = 0;

for(int i=0; i<rows; i++)
{
for(int j=0; j<columns; j++)
{
if ((i>0) && (A[i][j] >= A[i-1][j]))
continue;
if ((i<rows-1) && (A[i][j] >= A[i+1][j]))
continue;
if ((j>0) && (A[i][j] >= A[i][j-1]))
continue;
if ((j<columns-1) && (A[i][j] >= A[i][j+1]))
continue;
count++;
}
}
return(count);
}

void DelArray(int** A, int rows)
{
for(int i=0; i<rows; i++)
free(A[i]);
free(A);
}

int main()
{
int **A;

srand(time(0));

A = MakeArray(M, N);

PrintArray(A, M, N);

printf("\nLocal minimums count = %d\n", CalcLocalsMinimums(A, M, N));

DelArray(A, M);

return 0;
}[/code]
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа