Pers.narod.ru. Алгоритмы. Симметричный одномерный и двумерный массивы |
Задача состоит в том, чтобы проверить, симметричен ли одномерный массив (т.е., совпадает ли его первый элемент с последним, второй с предпоследним и т.д.)
Для целочисленного массива s размерностью n (данные вводятся с клавиатуры, правильность ввода не контролируется), получается следующая программа:
#include <stdio.h>
#include <conio.h>
void main() {
int i, n, s[100];
//Ввод данных
printf ("\nEnter size of array: ");
scanf ("%d",&n);
printf ("\nEnter %d item(s) of array: ",n);
for (i=0;i<n;i++) scanf("%d", &s[i]);
//Обработка
int simm=1; //Предположили, что массив симметричен
for (i=0;i<n/2;i++) //Цикл от 1-го элемента до середины; т.к. деление целых в C++ даёт целое,
//проблемы с четным или нечетным числом элементов в массиве не возникнет
if (s[i]!=s[n-1-i]) {
//Если хотя бы раз есть различные по значению элементы, стоящие симметрично
//относительно середины массива,
simm=0; break; //то массив не симметричен, сбросить флаг и выйти из цикла
}
if (simm==1) printf ("\nYes"); //выводим ответ Да или Нет
else printf ("\nNo");
getch();
return;
}
Основные действия листинга закомментированы, думаю, он понятен.
Для двумерного массива или матрицы понятие симметричности выглядит естественней - обычно имеется в виду матрица, симметричная относительно главной диагонали, то есть, такая матрица, элементы которой ai,j и
aj,i совпадают для всех различных между собой пар индексов i,j.
Для решения достаточно организовать двойной цикл с переменной границей вложенного цикла (см. тут, задача 4), который будет перебирать элементы выше (или ниже) главной диагонали и сравнивать их с симметрично расположенными элементами.
#include <stdio.h>
void main () {
const int n=4;
int a[n][n]= {
{1,2,3,4},
{2,1,5,6},
{3,5,1,7},
{4,6,7,1}
};
int i,j;
int simm=1;
for (i=0; i<n; i++)
for (j=i+1; j<n; j++)
if (a[i][j]!=a[j][i]) { simm=0; break; }
printf ("\n%s",(simm?"Yes":"No"));
getchar();
}
|
|