Дана такая задача. ------------------------- Дана действительная квадратная матрица
порядка 2n.
Получить новую матрицу, переставляя её блоки
размера n x n.
------------------------- На первый взгляд, перестановка блоков может показаться сложной, особенно если исходная матрица будет, где-нибудь, 100 х 100.
В целом алгоритм такой.
-----|----- 1 | 4 -----|-----
2 | 3
-----|-----
Куски переставлять надо как в пятнашках, т.е. двигать кусок в пустую ячейку. Поэтому для начала надо создать эту пустую ячейку. Для этого поместим левый верхний кусок (1) в какой-нибудь буферный массив. Далее начинаем сдвигать куски один за другим. (2) на место (1), (3) на место (2), (4) на место (3). Затем в кусок (4) записываем все из буферного массива. Если все правильно сделать должно получиться следующее.
Пусть исходная матрица порядка 2*n такая:
1 3 4 6 2 6 3 6 2 4 8 1 4 4 7 8
Результат должен быть такой:
2 4 1 3 4 4 2 6 8 1 4 6 7 8 3 6
Код программы на C
#include <stdio.h> #include <conio.h> #include <stdlib.h> void main() { int M[100][100]= {0}, bM[50][50]= {0}, n, i ,j; randomize(); printf("Enter one integer number (n): "); scanf("%d", &n); //zapolnenie i vyvod massiva 2n x 2n for (i=0; i<(2*n); i++) { for (j=0; j<(2*n); j++) { M[i][j]= random(10); printf("%d ", M[i][j]); } printf("\n"); } //zagoniaem levyi verhniy kusok v bufer bM for (i=0; i<n; i++) { for (j=0; j<n; j++) { bM[i][j]= M[i][j]; } } //peretaskivaem nijnii levyi kusok v verhnii levyi for (i=n; i<(2*n); i++) { for (j=0; j<n; j++) { M[i-n][j]= M[i][j]; } } //peretaskivaem nijnii pravyi kusok v nijnii levyi for (i=n; i<(2*n); i++) { for (j=n; j<(2*n); j++) { M[i][j-n]= M[i][j]; } } //peretaskivaem verhnii pravyi kusok v nijnii pravyi for (i=0; i<n; i++) { for (j=n; j<(2*n); j++) { M[i+n][j]= M[i][j]; } } //zagoniaem soderjimoe bufera bM v pravyi verhnii kusok for (i=0; i<n; i++) { for (j=n; j<(2*n); j++) { M[i][j]= bM[i][j-n]; } } //vyvod poluchennogo massiva printf("======================================\n"); for (i=0; i<(2*n); i++) { for (j=0; j<(2*n); j++) { printf("%d ", M[i][j]); } printf("\n"); } getch(); }
Здесь M[100][100] - это исходный массив, bM[50][50] - буферный массив.
Вот и все! Весь ключ в том что каждый элемент одного куска сдвигается в соответствующую ячейку второго куска. Везде сдвиг на n. Только в зависимости от направления n прибавляется к текущему индексу или отнимается.
Поделиться ссылкой в соц. сетях: | |
|