Nickolay.info. Алгоритмы. Симметричный одномерный и двумерный массивы

Задача состоит в том, чтобы проверить, симметричен ли одномерный массив (т.е., совпадает ли его первый элемент с последним, второй с предпоследним и т.д.)

Для целочисленного массива 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();
}

Рейтинг@Mail.ru

вверх гостевая; E-mail