Пятница, 29.03.2024, 07:35 | RSS | Приветствую Вас Гость
Главная | Регистрация | Вход
Меню сайта
Категории раздела
Разное [10]
Решения задач (студентам) [9]
PC Игры - кодинг [2]
Python [1]
PHP, Mysql [1]
HTML, CSS, Javascript [1]
Scilab [1]
Поиск
Опрос
Какой браузер вы сейчас используете?
Всего ответов: 51
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Главная » Статьи » Решения задач (студентам)

Алгоритм перестановки кусков квадратной матрицы
Дана такая задача.
-------------------------
Дана действительная квадратная матрица порядка 2
n. Получить новую  матрицу, переставляя её блоки размера 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 прибавляется к текущему индексу или отнимается.
Поделиться ссылкой в соц. сетях:

Категория: Решения задач (студентам) | Добавил: =Sanek= (03.03.2011)
Просмотров: 3603 | Комментарии: 1 | Рейтинг: 0.0/0
Всего комментариев: 1
1 =Sanek=  
0
Исправил пример кода программы. Кто уже пробовал прежний вариант... извините. Накосячил при оформлении материала. biggrin

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

© 2024 raznocoding.do.am