Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
1 / 1 / 0
Регистрация: 08.11.2019
Сообщений: 5

Оптимизировать код

08.11.2019, 00:33. Показов 2615. Ответов 3
Метки c++ (Все метки)

Студворк — интернет-сервис помощи студентам
Есть задача: Квадрат разбит на 4^k равновеликих квадратных клеток. Квадрат перегибается поочередно относительно вертикальной (правая половина подкладывается под левую) и горизонтальной (нижняя половина подкладывается под верхнюю) оси симметрии до тех пор, пока все клетки не будут расположены друг под другом. Требуется занумеровать клетки исходного квадрата таким образом, чтобы в результате выполнения операций перегиба номера клеток, расположенных друг под другом, образовали числовую последовательность 1,2,3,...,4^k, начиная с верхней клетки.

Не придумал как решать её через списки, стеки и т.д ( если кто знает, как сделать с использованием списков, стеков, очередей, помогите), поэтому решил сделать каряво ( для понимания ) получил:
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
52
53
54
55
56
57
58
59
60
61
62
63
int main()
{
    int k = 2;
 
    int let[256][256] = { 0 };
    int lett[256][256] = { 0 };
    if (k == 1) {
 
 
        for (int i = 1; i < (pow(2, k) + 1); i++) {
            for (int j = 1; j < (pow(2, k) + 1); j++) {
                let[i][1] = i;
                let[i][2] = i + j;
            }
        }
        for (int i = 1; i < (pow(2, k) + 1); i++)
        {
            for (int j = 1; j < (pow(2, k) + 1); j++)
                printf("%3d ", let[i][j]);
            printf("\n");
        }
        cout << endl;
    } else if (k==2) {
 
        for (int i = 1; i < (pow(2, k) + 1); i++) {
            for (int j = 1; j < (pow(2, k) + 1); j++) {
 
                lett[1][1] = i - (i - 1); // 1
                lett[2][1] = i * i; // 16
                lett[3][1] = (pow(4, k) + 1) - i; // 13
                lett[i][1] = i; // 4
 
                lett[1][2] = i * 2; // 8
                lett[2][2] = (pow(4, k) + 1) - (i * 2); // 9
                lett[3][2] = i * 3; // 12
                lett[i][2] = (pow(4, k) + 1) - (i * 3); // 5
 
                lett[1][3] = (i * 2) - 1; // 7
                lett[2][3] = (pow(4, k) + 1) - ((i * 2) - 1); // 10
                lett[3][3] = (pow(4, k) + 1) - ((i - 1) * 2); // 11
                lett[i][3] = (i - 1) * 2; // 6
 
                lett[1][j] = i / 2; // 2
                lett[2][j] = (pow(4, k) + 1) - (i / 2); // 15
                lett[3][j] = (pow(4, k) + 1) - (i - 1); // 14
                lett[i][j] = i - 1; // 3
                
            }
        }
        for (int i = 1; i < (pow(2, k) + 1); i++)
        {
            for (int j = 1; j < (pow(2, k) + 1); j++)
                printf("%3d ", lett[i][j]);
            printf("\n");
        }
    }
    else if (k > 2) {
        cout << "ERROR 404" << endl;
    }
    
 
    return 0;
}
Суть в том, что вот это:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
lett[1][1] = i - (i - 1); // 1
                lett[2][1] = i * i; // 16
                lett[3][1] = (pow(4, k) + 1) - i; // 13
                lett[i][1] = i; // 4
 
                lett[1][2] = i * 2; // 8
                lett[2][2] = (pow(4, k) + 1) - (i * 2); // 9
                lett[3][2] = i * 3; // 12
                lett[i][2] = (pow(4, k) + 1) - (i * 3); // 5
 
                lett[1][3] = (i * 2) - 1; // 7
                lett[2][3] = (pow(4, k) + 1) - ((i * 2) - 1); // 10
                lett[3][3] = (pow(4, k) + 1) - ((i - 1) * 2); // 11
                lett[i][3] = (i - 1) * 2; // 6
 
                lett[1][j] = i / 2; // 2
                lett[2][j] = (pow(4, k) + 1) - (i / 2); // 15
                lett[3][j] = (pow(4, k) + 1) - (i - 1); // 14
                lett[i][j] = i - 1; // 3
Вообще никуда не годится, прошу помочь, кто чем может)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.11.2019, 00:33
Ответы с готовыми решениями:

Нужно оптимизировать код
Гистограмма является многоугольником, сформированным из последовательности прямоугольников, выровненных на общей базовой линии....

Как можно еще оптимизировать код?
Как еще можно оптимизировать данный код? Если вкратце, то он выводит значение АВ, если ключ = вводу пользотвателя. #include...

Код потребляет очень много памяти. Подскажите как оптимизировать?
Есть код на C++ (компилируется под GCC) - подсчёт коэффициентов осцилляторной системы методом Рунге-Кутта (метод в простейшем случае)....

3
фрилансер
 Аватар для Алексей1153
6466 / 5685 / 1131
Регистрация: 11.10.2019
Сообщений: 15,129
08.11.2019, 09:30
Лучший ответ Сообщение было отмечено liluka как решение

Решение

как бы я решал: имеем изначальный "квадратный" массив N*N, в каждой клетке в каком-нибудь виде содержится информация о изначальных координатах x,y, а также вектор с текущей пачкой элементов (в результате подгибания)

в цикле складываем квадрат поочерёдно по осям, пока квадрат не превратится в столбик 1*1 высотой N*N. Сканируем столбик и поочерёдно по изначальным x,y расставляем инкрементом значение
1
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
08.11.2019, 22:44
Лучший ответ Сообщение было отмечено liluka как решение

Решение

liluka, допустим, так:
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
#include <iostream>
#include <numeric>
 
int main()
{
    size_t k;
    std::cin >> k;
    size_t side = pow(2, k);
    uint32_t* arr = new uint32_t[side * side];
    uint32_t** tmp = new uint32_t * [side * side];
 
    std::iota(arr, arr + side * side, 1);
    tmp[0] = arr;
    for (size_t s(side* side), x(1), y(1); s != 1; s >>= 2, x = y <<= 1) {
        for (size_t i = 0; i < x; ++i)
            for (size_t j = 0; j < y; ++j)
                tmp[(x * 2 - 1 - i) * side + j] = !((i % 2) ^ (j % 2))
                ? tmp[i * side + j] + (side * side / (x * y) - 1)
                : tmp[i * side + j] - (side * side / (x * y) - 1);
        for (size_t i = 0; i < x * 2; ++i)
            for (size_t j = 0; j < y; ++j)
                tmp[i * side + y * 2 - 1 - j] = !((i % 2) ^ (j % 2))
                ? tmp[i * side + j] + (side * side / (x * y * 2) - 1)
                : tmp[i * side + j] - (side * side / (x * y * 2) - 1);
    }
    for (size_t i = 0; i < side; ++i) {
        for (size_t j = 0; j < side; ++j) {
            //std::cout.width(5);
            std::cout << *tmp[i * side + j] << ' ';
        }
        std::cout << '\n';
    }
 
    delete[] arr;
    delete[] tmp;
    return 0;
}
1
1 / 1 / 0
Регистрация: 08.11.2019
Сообщений: 5
08.11.2019, 23:30  [ТС]
Спасибо огромное вам !!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.11.2019, 23:30
Помогаю со студенческими работами здесь

Как оптимизировать обращение к элементам вектора?
Добрый день. Подскажите, пожалуйста, где я не прав. Есть класс, в нем координаты и другие параметры, описывающие существ (овцы и...

Оптимизировать код работы с однотипными компонентами
Есть код прямиком из преисподней:DЭто чудо работает, и даже может создавать адекватные запросы : int...

Посоветуйте как оптимизировать данный код
Есть такой код. Подскажите как его оптимизировать: т.е. сделать не таким &quot;громадным&quot;. На главной форме выбираются параметры кабеля из...

Как мне оптимизировать мой код
в общем, есть компонент Combobox, с помощью его я выбираю тот параметр по которому хочу сортировать свои значения, параметров много, и в...

Как можно оптимизировать?
Подскажите пожалуйста. Имеется форма на которой находятся 20 edit'ов, как можно через цикл записать из них данные в массив.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru