Определить значение максимального из минимальных элементов диагоналей матрицы - 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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д