Транспонировать матрицу заданную одномерным массивом - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Дана матрица 5х5. Только задана она

одномерным массивом

(т.е. 25 элементов в ряд). Надо записать транспонированную матрицу данной. Справка:
Матрица Транспонированная матрица Т.е. в транспонированной матрице строки "стали" столбцами.
как? Вся

задача

звучит так: Квадратный полиндром - это матрица состоящая из букв , которая читается одинаково по четырем направлениям 1-е 123, 456, 789 2-е 987, 654, 321 3-е 147, 256, 789 4-е 987, 652, 741. пример Написать функцию

int is_square_palindrome(char square[], int num_of_rows)

, которая 1) в качестве аргументов принимает массив букв и количество строк (они же и столбцы) квадрата 2) выводит 1, если массив образует квадртаный полиндром, и 0 - если нет. (она должна быть только именно такая. добавлять/убирать/изменять аргументы/тип/название нельзя) Написать программу, которая принимает от юзверя массив букв (массив, НЕ строку), образующий матрицу 5х5, и проверяет, является образует ли введенный массив квадратный полиндром. Например, чтобы ввести сатор....ротас, пользователь вводит {'S', 'A', 'T', 'O', 'R', 'A', 'R', 'E', 'P', 'O', ... , 'R', 'O', 'T', 'A', 'S‬‬} - вот такой массив. алгоритм, как я его вижу, прост: 1. записать в новую переменную обратный массив (т.е. введенный массив в обратном порядке) 2. записать в новую переменную транспонированный массив (т.е. получится чтение по 3-му пути: 1, 6, 11, 16, 21й элементы, и т.п. 2. записать в новую переменную обратный транспонированный массив (т.е. транспонированный в обратном порядке) если введенный массив = обратному=транспонированному=обратному транспонированному => квадратный полиндром. нет - значит 0. обратный массив - просто
char rewerse_a_square(char square[], int size)
{
  int i, temp;
 
  for (i = 0; i < SQUARE_SIZE / 2; i++) //работаем сразу в обоих направлениях
  {                                     //поэтому счетчик только до середины
    temp = square[i];
    square[i] = square[SQUARE_SIZE - 1 - i];
    square[SQUARE_SIZE - 1 - i] = temp;
  }
 
  return square[];
}
С транспонированием уже сложнее... Что-то я пока не могу углядеть зависимость, кроме того, как центральные диагональные элементы остаются на своих местах. Можно не писать код, можно подсказать словами алгоритм. Всю целиком задачу тоже решать не надо. Но Если есть другой алгоритм решения - было бы интересно. Спасибо

Решение задачи: «Транспонировать матрицу заданную одномерным массивом»

textual
Листинг программы
/*квадратный палиндром - в четырех направлениях читается одинаково
примеры
s a t o r
a r e p o 
t e n e t
o p e r a
r o t a s
 
1 2 3 4 5
2 4 7 6 4
3 7 8 7 3
4 6 7 4 2
5 4 3 2 1
*/
 
#include <stdio.h>
#include <string.h>
#define N 5
 
/*функция сравнения, заточенная под данную задачу, где все размерности равны N*/
/*т.е., на разные размерности не проверяем*/
int cmp (char a[], char b[])
{   for (int i = 0; i<N; i++)
        if (a[i] != b[i])
            return 1;   //"строки" не равны
    return 0;           //"строки" равны
}
 
 
int is_square_palindrome(char square[])
{   char horizontal[N][N+1], vertical[N][N], horizontal_reverse[N][N], vertical_reverse[N][N], i, j, k;
    
    for (i = 0; i<N; i++)
       for (j = 0, k = N-1; j<N; j++, k--)
            horizontal_reverse[i][k] = horizontal[i][j] = square[i*N + j];
    
 
    for (j = 0; j<N; j++)
       for (i = 0, k = N-1; i<N; i++, k--)
            vertical_reverse[j][k] = vertical[j][i] = horizontal[i][j];
   
    for (i = 0, k = N-1; i<N; i++, k--)
        if( !(cmp    (horizontal[i], horizontal_reverse[k]) == 0
                && cmp(horizontal[i], vertical[i]) == 0
                && cmp(horizontal[i], vertical_reverse[k]) == 0))
        return 0;
    
    return 1;
}
 
int main()
{   char buf [N*N+1];
    printf("Enter the string:\n");
    fgets(buf, N*N+1, stdin);
    buf[strlen(buf)] = '\0';
 
    if (is_square_palindrome(buf))
        printf("\n\nIt IS a square palindrome");
    else
        printf("\n\nIt is NOT a square palindrome");
 
    fflush(stdin);
    getchar();
    return 0;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы для работы с I/O и строками
  2. Определяем константу N, которая задает размерность квадратной матрицы
  3. Создаем функцию cmp, которая сравнивает два массива символов на равенство
  4. В функции is_square_palindrome создаем пять массивов: horizontal, vertical, horizontal_reverse, vertical_reverse, а также переменные i, j, k. Используем их для сравнения символов в разных направлениях
  5. Заполняем массивы horizontal и vertical символами из входной строки, а также их перевернутыми версиями в массивы horizontal_reverse и vertical_reverse
  6. Проходим по всем элементам массивов и сравниваем их между собой. Если найдется неравенство, то возвращаем 0, иначе продолжаем проверку
  7. Если все элементы равны, то возвращаем 1, указывая на то, что входная строка является квадратным палиндромом
  8. В функции main считываем входную строку с помощью функции fgets, обрезаем ее до нужной длины и передаем в функцию is_square_palindrome
  9. Выводим соответствующее сообщение в зависимости от результата проверки
  10. Завершаем программу, считывая остаток символов из потока ввода и выходя из программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4 из 5
Похожие ответы