Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Циклический сдвиг массива - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ функциональные объекты http://www.cyberforum.ru/cpp-beginners/thread1090625.html
std::find_if(m_slProcessList.begin(), m_slProcessList.end(), std::bind1st(std::mem_fun(&TaskManager::EqualProcessID), 0)); какой параметр передать в третий аргумент find_if, чтобы заработало?
C++ две функции в одной программе Добрый день. Есть проблема. Нужна помощь. Изучая с++ по самоучителю. Там указанны были две программы. Первая программа — запрашивает значение Х. Пользователь вводит. Запрашивает значение У.... http://www.cyberforum.ru/cpp-beginners/thread1090621.html
C++ Объявить массив из 5 элементов int и инициализируйте его первыми пятью положительными нечетными числами.
Дан вопрос. Объявить массив из 5 элементров int и инициализируйте его первыми пятью положительными нечетными числами. Я написал код .Он предельно прост.Может я не правильно понял вопрос? Может автор...
Найти наименьший номер элемента последовательности, для которого выполняется условие М C++
Помогите,пожалуйста,никак не могу составить программу. Найти наименьший номер элемента последовательности,для которого выполняется условие М.Вывести на экран этот номер и все элементы a_{i},где...
C++ Почему обращение к методам осуществляется через оператор прямого доступа, а не через оператор указателей->? http://www.cyberforum.ru/cpp-beginners/thread1090556.html
#include <iostream> using namespace std; class random { public: void Set(int b){a=b;} int Get(){return a;} private: int a;
C++ Как в программе использовать время и дату на компьютере Хочу написать программу где ты вводишь дату своего рождения, а тебе показывается сколько ты прожил, как использовать дату и время с компа? подробнее

Показать сообщение отдельно
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
06.02.2014, 15:56
Можно еще вот так:
Пишем функцию для сдвига на один символ "кольца" квадратной матрицы. Можно заметить, что для однозначного определеня кольца достаточно знать номер верхней строки строки. Число элементов в таком кольце k = N - 2 * i, N - размернсть массива, i - номер строки. Поэтому все выражение можно записать ввиде вызова одной функции в цикле:
C++
1
2
for(int i = 0; N - 2 *i > 0; ++i)
    CircleMoveMatrixElement(array, i, N);
Число вызовов соответствует числу позиций на которые будет "вращаться матрица". Для упрощения функция вызывается только один раз.
Осталось реализовать саму функцию CircleMoveMatrixElement(array, i, N):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void CircleMoveMatrixElement(int** array, int i, int N)
{
    int temp_element_00 = array[i][i];
    int temp_element_01 = array[i][N - i - 1];
    int temp_element_10 = array[N - i - 1][i];
    int temp_element_11 = array[N - i - 1][N - i - 1];
    for(int index = N - i -1; index > i; --index) {
        array[i][index]                 = array[i][index - 1];
        array[index][N - i - 1]         = array[index - 1][N - i - 1];
        array[N - i - 1][N - index - 1] = array[N - i -1][N - index];
        array[N - index - 1][i]         = array[N - index][i];
    }
    array[i][i + 1]             = temp_element_00;
    array[i + 1][N - i - 1]     = temp_element_01;
    array[N - i - 2][i]         = temp_element_10;
    array[N - i - 1][N - i - 2] = temp_element_11;
}
Может конечно где-то соврал, но похоже работает...
Вот полный код:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include<iostream>
#include<time.h>
 
void CircleMoveMatrixElement(int** array, int i, int N);
int main (int argc, char* argv[])
{
    const int n = 5;
    int** arr;
    arr = new int*[n];
    for (int i = 0; i < n; ++i)
        arr[i] = new int[n];
    srand(time(NULL));
    for (int k = 0; k < n; ++k)
        for (int s = 0; s < n; ++s)
            arr[k][s] = rand()%10;
 
    for (int k = 0; k < n; ++k) {
        for (int s = 0; s < n; ++s)
            std::cout << arr[k][s] << ' ';
        std::cout << std::endl;
    }
    std::cout << std::endl;
    for(int i = 0; n - 2 *i > 0; ++i)
        CircleMoveMatrixElement(arr, i, n);
 
 
    for (int k = 0; k < n; ++k) {
        for (int s = 0; s < n; ++s)
            std::cout << arr[k][s] << ' ';
        std::cout << std::endl;
    }
    std::cout << std::endl;
    return 0;
}
void CircleMoveMatrixElement(int** array, int i, int N)
{
    int temp_element_00 = array[i][i];
    int temp_element_01 = array[i][N - i - 1];
    int temp_element_10 = array[N - i - 1][i];
    int temp_element_11 = array[N - i - 1][N - i - 1];
    for(int index = N - i -1; index > i; --index) {
        array[i][index]                 = array[i][index - 1];
        array[index][N - i - 1]         = array[index - 1][N - i - 1];
        array[N - i - 1][N - index - 1] = array[N - i -1][N - index];
        array[N - index - 1][i]         = array[N - index][i];
    }
    array[i][i + 1]             = temp_element_00;
    array[i + 1][N - i - 1]     = temp_element_01;
    array[N - i - 2][i]         = temp_element_10;
    array[N - i - 1][N - i - 2] = temp_element_11;
}

P.S. Функция работает по принципу циклического сдвига элементов в строках и столбцах по часовой стрелке. Сперва зопоминаем значения элементов которые уйдут за "границы" квадрата, а потом присваиваем их значения соответствующим элементам по ходу часовой стрелки.
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru