Определить значение максимального из минимальных элементов диагоналей матрицы - C (СИ)
Формулировка задачи:
Здравствуйте. Не судите строго если есть подобна тема, но нужна помощь по матрицам. Дана рандомная квадратная матрица с указанным размером. Нужно определить значение максимального из минимальных элементов диагоналей, параллельных главной диагонали, начиная с единичной диагонали. Потом заменить все элементы диагонали содержащей этот элемент нулевыми значениями. Но замена пока не нужна, нужно разобраться с нахождением минимального и потом из них макс элемента. Создание и проход по диагоналям я сделал, и для примера написал нахождение суммы их элементов по отдельности. Но вот с нахождением минимального элемента проблемки. я думал сразу записывать значения в масив, потом сортировать, но не вышло, так как не проходили динамических массивов и их получается многовато как то. Потом думал испоьзовать стандартную ункцию по нахождению мин и макс элементов, но опять же по проходу по матрице, эти элементы надо где то хранить. Вот и озадачен этим воросом, как найти минимальные элементы каждой диагонали кроме главной, и потом найти максимальный элемент среди минимальных, что бы потом начать думать как все это дело заменить.
Помогите пожалуйста, хотябы натолкните на мысль, на алгоритм решения.
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
setlocale(LC_ALL, "RU");
int n;
printf("N:\n");
scanf("%d", &n);
int i,j,a[n][n],sum;
int arr;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
a[i][j] = rand()%10; // заполнение матрицы
for(i=0;i<n;i++)
{
printf("\n");
for(j=0;j<n;j++)
printf("%d ", a[i][j]); // вывод матрицы
}
printf("\n \n");
printf("Выше главной диагонали:");
for(i=0;i<n-1;i++) //в матрице n-1 диагоналей выше главной.
{
sum=0;
for(j=0;j<i+1;j++)
{
sum+=a[j][j+n-1-i];
}
printf("%d ", sum);
}
printf("\nНиже главной диагонали:");
for(i=0;i<n-1;i++) //в матрице n-1 диагоналей Ниже главной.
{
sum=0;
for(j=0;j<i+1;j++)
sum+=a[j+n-1-i][j];//Разница между столбцом и строкой меняется от n-1 до 1
printf("%d ", sum);
}
printf("\n");
}Решение задачи: «Определить значение максимального из минимальных элементов диагоналей матрицы»
textual
Листинг программы
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
setlocale(LC_ALL, "RU");
int n; // число элементов
int i,j, k, // счетчики
flag, // флажок для определения первого элемента диагонали минимальным
min, max;
printf("N:");
scanf("%d", &n);
// выделение памяти под массив
int **a = (int**)malloc(n*sizeof(int)) ;
for (i=0; i<n;++i)
a[i]=(int*)malloc(n*sizeof(int)) ;
// заполнение
srand((time(0))); // чтобы ранд давал разные числа
for(i=0; i<n; i++)
for(j=0; j<n; j++)
a[i][j] = rand()%10;
// вывод
for(i=0; i<n; i++) {
printf("\n");
for(j=0; j<n; j++)
printf("%d ", a[i][j]);
}
/*
0,0 0,1 0,2 0,3
1,0 1,1 1,2 1,3
2,0 2,1 2,2 2,3
3,0 3,1 3,2 3,3
*/
/* исходя из рисунка побочные диагонали будут
* 1. 3,0
* 2. 2,0, 3,1
* 3. 1,0, 2,1 3,2
* под диагональю разность между индексами одинаковая и положительная
* 4. 0,1 1,2 2,3
* 5. 0,2 1,3
* 6. 0,3/
* над - разность между индексами одинаковая и отрицательная
*/
printf ("\n\n\n");
int sum=n;
int m[(n-1)*2]; //
int ind=0;
while(--sum!=-n) { // пока сумма не равна -n, внашем примере -3, сначала декремент суммы потом сравнение
flag=0;
for ( j=0; j<n; ++j) {
for ( i=0; i<n; ++i) {
if(i-j!=0 && j-i==sum) { // элемент очередной диагоналиб исклчая главную
if (!flag) {
min=a[i][j]; //printf (" _min_0 %d ",min);
flag=1;
} else if (min>a[i][j])
min=a[i][j];
printf ("%4d", a[i][j]);
}
}
}
if (flag) {
m[ind]=min;
++ind;
printf (" : min %d \n", min);
}
}
printf("min in diag:");
for (i=0; i<(n-1)*2; ++i)
printf ("%4d, ", m[i]);
printf("\n");
max=m[0];
ind=0;
for (i=1; i<(n-1)*2; ++i)
if (max<m[i]) {
max=m[i];
ind=i;
}
printf ("max in min =%d in diag# %d", max, ind);
// замена
sum=n;
k=0;
while(--sum!=-n) { // пока сумма не равна -n, внашем примере -3
for ( j=0; j<n; ++j) {
for ( i=0; i<n; ++i) {
if(i-j!=0 && j-i==sum && k==ind) // элемент очередной диагонали
a[i][j]=0;
}
}
k++;
if (sum==0) k--; // вычитаем индекс главной диагонали
}
// вывод
for(i=0; i<n; i++) {
printf("\n");
for(j=0; j<n; j++)
printf("%d ", a[i][j]);
}
// освобождение памяти
for (i=0; i<n;++i)
free(a[i]);
free (a);
return 0;
}