Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 18.03.2019
Сообщений: 689

Объяснить код

02.01.2020, 15:03. Показов 610. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите написать комментарии к коду и что вообще тут делается?

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <cstdio>
#include <vector>
#include <queue>
#include <cassert>
 
struct Pos {
    int i;
    int j;
};
 
int main()
{
    int n;
    scanf("%d", &n);
    std::vector<std::vector<int>> a(n, std::vector<int>(n));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &a[i][j]);
        }
    }
    std::vector<int>orig(1);
    for (auto &line : a) {
        for (int &item : line) {
            if (item > 0) {
                int newValue = (int)orig.size();
                orig.push_back(item);
                item = newValue;
            }
        }
    }
    const int UNDEF = -1;
    std::vector<std::vector<int>> dist(n, std::vector<int>(n, UNDEF));
    std::queue<Pos> q;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (a[i][j] > 0) {
                dist[i][j] = 0;
                q.push(Pos{ i,j });
            }
        }
    }
    const int MULTIPLE = -1;
    while (!q.empty()) {
        Pos cur = q.front();
        q.pop();
        for (int di = -1; di <= 1; di++) {
            for (int dj = -1; dj <= 1; dj++) {
                if (di*di + dj*dj == 1) {
                    int ni = cur.i + di;
                    int nj = cur.j + dj;
                    if (0 <= ni&&ni < n && 0 <= nj&&nj < n) {
                        if (dist[ni][nj] == UNDEF) {
                            dist[ni][nj] = dist[cur.i][cur.j] + 1;
                            a[ni][nj] = a[cur.i][cur.j];
                            q.push(Pos{ ni,nj });
                        }
                        else if (dist[ni][nj] == dist[cur.i][cur.j] + 1 && a[ni][nj] != a[cur.i][cur.j]) {
                            a[ni][nj] = MULTIPLE;
                        }
                    }
                }
            }
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (j > 0) {
                printf(" ");
            }
            if (a[i][j] == MULTIPLE) {
                printf("0");
            }
            else {
                assert(a[i][j] > 0);
                printf("%d", orig[a[i][j]]);
            }
        }
        printf("\n");
    }
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.01.2020, 15:03
Ответы с готовыми решениями:

Объяснить код
Здравствуйте. Помогите пожалуйста прописать, что происходит в данном коде по строкам #include &lt;cstdio&gt; #include &lt;vector&gt;...

Объяснить код
#include&lt;stdio.h&gt; #include&lt;string.h&gt; #include&lt;locale.h&gt; #include &lt;stdlib.h&gt; int proverka(char *s, char *t) { int i,...

Объяснить код на С++
Прошу объяснить код на С++. Каким алгоритмом происходит распознание функций. Программа построения графиков функций. Разработка на visual...

6
02.01.2020, 15:21

Не по теме:

То чувство, когда всё ещё не знаешь, что такое вектор и не дошел до него :(((

0
02.01.2020, 15:29

Не по теме:

Цитата Сообщение от nyaka_wai Посмотреть сообщение
То чувство, когда всё ещё не знаешь, что такое вектор и не дошел до него
Знаешь что такое шаблоны, но не знаешь вектора?
Реально поучи вектор и вообще контейнеры, пригодятся

0
 Аватар для nyaka_wai
85 / 34 / 20
Регистрация: 15.12.2019
Сообщений: 89
02.01.2020, 15:38
Цитата Сообщение от AndryS1 Посмотреть сообщение

Не по теме:


Знаешь что такое шаблоны, но не знаешь вектора?
Реально поучи вектор и вообще контейнеры, пригодятся

Не по теме:

Пока что классы разбираю,, ООП все дела - планомерно, не спеша. До векторов тоже дойдет очередь. В планах вообще максимально полно изучить c++ со всеми особенностями, не отвлекаясь на другие языки и всякий мейнстрим :)

0
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
02.01.2020, 15:46
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <cstdio>
#include <vector>
#include <queue>
#include <cassert>
 
struct Pos { // Структура которая хранит в себе позицию элемента матрицы 
    int i;
    int j;
};
 
int main()
{
    int n;
    scanf("%d", &n);
    std::vector<std::vector<int>> a(n, std::vector<int>(n)); // создали двумерный вектор, nxn
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &a[i][j]);// заполнили его через ввод
        }
    }
    std::vector<int>orig(1); // 
    for (auto& line : a) { 
        for (int& item : line) { //Перебор всех элементов матрицы
            if (item > 0) { // если элемент больше 0
                int newValue = (int)orig.size(); 
                orig.push_back(item); // закидываем этот элемент в конец
                item = newValue; // заменяем его прошлое место текущим количеством закинутых элементов
            }
        }
    }
    const int UNDEF = -1;
    std::vector<std::vector<int>> dist(n, std::vector<int>(n, UNDEF)); // создаём двумерный вектор nxn, заполнили его -1
    std::queue<Pos> q; // создаём список позииции элементов 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) { // проходимся по всему вектору dist
            if (a[i][j] > 0) { // если значение элемента больше 0
                dist[i][j] = 0; // делаем его нулевым
                q.push(Pos{ i,j }); // добавляем значение в список позиций
            }
        }
    }
    const int MULTIPLE = -1;
    while (!q.empty()) { // пока наш список не станет пустым
        Pos cur = q.front(); // берём первый элемент из списка и записываем его в cur
        q.pop(); // удаляем первый элемент из списка
        for (int di = -1; di <= 1; di++) { 
            for (int dj = -1; dj <= 1; dj++) {
                if (di * di + dj * dj == 1) { // идёт перебор, без задания сложно сказать зачем он
                    int ni = cur.i + di; // сумируем позицию которую мы вытащили из списка
                    int nj = cur.j + dj; // с тем что я не могу объяснить
                    if (0 <= ni && ni < n && 0 <= nj && nj < n) { // если 0 <= ni < n и 0 <= nj < n  
                        if (dist[ni][nj] == UNDEF) { // если элемент ni nj = -1
                            dist[ni][nj] = dist[cur.i][cur.j] + 1; // этому элементу зададим значение элемента из списка + 1
                            a[ni][nj] = a[cur.i][cur.j]; // матрице а делаем тоже самое только без +1
                            q.push(Pos{ ni,nj }); // в список добавляем ni,nj ()
                        }
                        else if (dist[ni][nj] == dist[cur.i][cur.j] + 1 && a[ni][nj] != a[cur.i][cur.j]) { // если элемент dist из списка +1? равен элементу который я не могу понять и эти же элементы не равны друг другу в матрице а
                            a[ni][nj] = MULTIPLE; // присвоим непонятному элементу матрицы а значение -1
                        }
                    }
                }
            }
        }
    }
    for (int i = 0; i < n; i++) { 
        for (int j = 0; j < n; j++) { 
            if (j > 0) { // если j > 0
                printf(" "); // Вывод 
            } 
            if (a[i][j] == MULTIPLE) {  // если элемент равен -1 
                printf("0"); // выводим 0
            } 
            else { 
                assert(a[i][j] > 0);  // если элемент равен 0 вызываем точку останова, для дебага 
                printf("%d", orig[a[i][j]]);  // Вывод
            }
        }
        printf("\n"); // переносы 
    }
    return 0;
}

Не по теме:

Цитата Сообщение от nyaka_wai Посмотреть сообщение
В планах вообще максимально полно изучить c++
С тех пор этот человек не делал ничего, кроме самообучения с++)

1
0 / 0 / 0
Регистрация: 18.03.2019
Сообщений: 689
08.01.2020, 19:30  [ТС]
Цитата Сообщение от AndryS1 Посмотреть сообщение
std::vector<int>orig(1); //
а это что значит?

Добавлено через 3 минуты
AndryS1, это эта задача с сайта acmp 621
0
199 / 155 / 45
Регистрация: 11.11.2019
Сообщений: 348
08.01.2020, 19:36
Цитата Сообщение от Катя6 Посмотреть сообщение
а это что значит?
Создаем вектор (по сути массив) с именем orig, элементы которого имеют целочисленный тип int, содержащий один элемент, инициализированный конструктором по-умолчанию.
vector является одним из представителей классов-контейнеров стандартной библиотеки.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.01.2020, 19:36
Помогаю со студенческими работами здесь

Объяснить код
Двоичный поиск #include &quot;stdafx.h&quot; #include &quot;iostream&quot; #include &quot;conio.h&quot; #include &quot;stdio.h&quot; using namespace std; int...

Объяснить код
Может кто-нибудь смог бы закомментировать данные участок кода или объяснить что за что отвечает( можно еще и ссылки на сторонние ресуры...

Объяснить код
Написать программу, которая вычисляет частичную сумму ряда \sum_{k=1}^{\infty}ln(1+\frac{1}{k}) Расчет должен производиться двумя...

Прошу объяснить код С++
здравствуйте, прошу объяснить как для полного нуба простейшими словами данный кусок кода: y=150 (10010110 в двоичной) int y=150; ...

Лабиринт. Объяснить код
Всем привет. Нашел на просторах вашего форума такой вот код: Проверил, все работает. Может кто объяснить, как эта программа устроена, мне...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru