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

Массив: Вывести массив по заданной схеме...

25.02.2019, 18:04. Показов 2293. Ответов 19

Студворк — интернет-сервис помощи студентам
Нужно вывести массив как показано на картинке, буду благодарен за помощь.
Миниатюры
Массив: Вывести массив по заданной схеме...  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.02.2019, 18:04
Ответы с готовыми решениями:

Массив: Линейный массив привести к матрице по заданной схеме...
Здравствуйте! Дан произвольный линейный массив x1,x2...xn, который вводит пользователь, из которого нужно привести матрицу вида 1 ...

Заполнить двумерный массив A [6][6] по заданной схеме
31 25 19 18 7 1 32 26 20 17 8 2 33 27 21 16 9 3 34 28 22 15 10 4 35 29 23 14 11 5 36 30 24 13 12 6

Заполнить двумерный массив A [6][6] по заданной схеме
Составить программу заполнения двумерного массива А по заданной схеме. Результаты выдать на экран и в файл. 6 12 13 19 30 36 5 11 14...

19
 Аватар для TButton
290 / 87 / 28
Регистрация: 25.01.2016
Сообщений: 529
Записей в блоге: 1
26.02.2019, 07:54
Не понятно
1
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
26.02.2019, 09:15
как я понял нужно преобразовать одномерный массив в двумерный по нарисованному алгоритму и вывести последний

Добавлено через 6 минут
ну или наоборот, непонятно
0
 Аватар для JohnBlack123
215 / 162 / 52
Регистрация: 09.12.2017
Сообщений: 520
26.02.2019, 09:22

Не по теме:

zayats80888, автор еще собирается с мыслями и в глубоких раздумьях, решает, что он хотел этим сказать.


0
611 / 416 / 151
Регистрация: 11.01.2019
Сообщений: 1,746
26.02.2019, 10:08
Вот как-то так:

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
#include <vector>
 
enum class dir_t {
    left_to_right = 1, top_to_bottom = 2, right_to_left = 3, bottom_up = 4
};
 
std::vector<int> spiral_traverse(const std::vector<std::vector<int>> & array) {
    if (array.size() == 0 || array[0].size() == 0) return std::vector<int>(std::vector<int>());
    if (array.size() != array[0].size()) return std::vector<int>();
    if (array.size() == 1 && array[0].size() == 1) return std::vector<int>(std::vector <int>(1, array[0][0]));
    std::vector<int> result;
    auto res_size = array.size() * array[0].size();
    int uppermost = 0, leftmost = 0;
    int lowermost = array.size() - 1;
    int rightmost = array[0].size() - 1;
    dir_t direction = dir_t::top_to_bottom;
    bool switch_dir_1 = true, switch_dir_2 = true;
    while (result.size() != res_size) {
        switch (direction) {
        case dir_t::top_to_bottom:
            for (int i = uppermost; i <= lowermost; ++i) result.push_back(array[i][switch_dir_1 ? rightmost : leftmost]);
            if (switch_dir_1) {
                direction = dir_t::right_to_left; 
                --rightmost;
            }
            else {
                direction = dir_t::left_to_right;
                ++leftmost;
            }
            switch_dir_1 = !switch_dir_1;
            break;
        case dir_t::right_to_left:
            for (int j = rightmost; j >= leftmost; --j) result.push_back(array[lowermost][j]);
            direction = dir_t::bottom_up;
            --lowermost;
            break;
        case dir_t::bottom_up:
            for (int i = lowermost; i >= uppermost; --i) result.push_back(array[i][switch_dir_2 ? leftmost : rightmost]);
            direction = dir_t::top_to_bottom;
            if (switch_dir_2) ++leftmost; else --rightmost;
            switch_dir_2 = !switch_dir_2;
            break;
        case dir_t::left_to_right:
            for (int j = leftmost; j <= rightmost; ++j) result.push_back(array[lowermost][j]);
            direction = dir_t::bottom_up;
            --lowermost;
            break;
        }
    }
    return result;
}
 
int main()
{
    auto array = spiral_traverse({ {1} });
    array = spiral_traverse({ {4,1}, {3,2} });
    array = spiral_traverse({ {7,8,1}, {6,9,2}, {5,4,3} });
    array = spiral_traverse({ {10,11,16,1}, {9,12,15,2}, {8,13,14,3}, {7,6,5,4} });
    array = spiral_traverse({ {13,14,23,22,1}, {12,15,24,21,2}, {11,16,25,20,3}, {10,17,18,19,4}, {9,8,7,6,5} });
    array = spiral_traverse({ {16,17,36,29,28,1}, {15,18,35,30,27,2}, {14,19,34,31,26,3}, {13,20,33,32,25,4}, {12,21,22,23,24,5}, {11,10,9,8,7,6} });
    return 0;
}
Добавлено через 1 минуту
PS: Думаю, что вывести на экран результирующий одномерный массив array вы сможете сами
1
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
26.02.2019, 19:18
Дело было вечером - делать было нечего. Предлагаю еще один вариант. Поскольку ТС не уточнил, требуется ли заполнение матрицы или вывод элементов по указанному пути обхода, предусмотрел оба варианта.
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <iostream>
#include <functional>
#include <string>
#include <sstream>
#include <vector>
 
using namespace std;
using Row = vector<int>;
using Matrix = vector<Row>;
using AccessFuncPtr = function<void(int &x)>;
 
struct Pos {
    long i, j;
};
 
struct Rect {
    long top, left, bottom, right;
 
    bool isCorrect() const {
        return ((top <= bottom) && (left <= right));
    }
 
    bool isContains(const Pos &pos) const {
        return ((pos.i >= top) && (pos.i <= bottom) && (pos.j >= left) && (pos.j <= right));
    }
};
 
struct Step {
    Pos mov;
    Pos ret;
    Rect ch_rect;
};
 
void traversal(Matrix &a, Pos pos, const vector<Step> &step_list, AccessFuncPtr access_func) {
    Rect rect = {0, 0, static_cast<long>(a.size() - 1), static_cast<long>(a[0].size() - 1)};
    while (rect.isCorrect()) {
        for (const Step &step : step_list) {
            // Если позиция не была исправлена,
            if (!rect.isCorrect() || !rect.isContains(pos)) {
                // значит обход не может быть продолжен.
                return;
            }
 
            while (rect.isContains(pos)) {
                // Вызов функции доступа к элементам матрицы.
                access_func(a[static_cast<size_t>(pos.i)][static_cast<size_t>(pos.j)]);
 
                // Перемещение текущей позиции.
                pos.i += step.mov.i;
                pos.j += step.mov.j;
            }
 
            // Исправление некорректной позиции.
            pos.i += step.ret.i;
            pos.j += step.ret.j;
 
            // Изменение размера области обхода.
            rect.top += step.ch_rect.top;
            rect.left += step.ch_rect.left;
            rect.bottom += step.ch_rect.bottom;
            rect.right += step.ch_rect.right;
        }
    }
}
 
string to_string(const Matrix &a) {
    stringstream ss;
    for (const auto &row : a) {
        for (const auto &x : row) {
            ss.width(5);
            ss << x;
        }
 
        ss << endl;
    }
 
    return ss.str();
}
 
int main() {
    const vector<Step> u_form = {
    //    di  dj   ->i ->j     t   l   b   r
        {{+1,  0}, {-1, -1}, { 0,  0,  0, -1}}, // Вниз*   | Вверх-Влево  | <Правый край.
        {{ 0, -1}, {-1, +1}, { 0,  0, -1,  0}}, // Влево*  | Вверх-Вправо | ^Нижний край.
        {{-1,  0}, {+1, +1}, { 0, +1,  0,  0}}, // Вверх*  | Вниз-Вправо  | >Левый край.
        {{+1,  0}, {-1, +1}, { 0, +1,  0,  0}}, // Вниз*   | Вверх-Вправо | >Левый край.
        {{ 0, +1}, {-1, -1}, { 0,  0, -1,  0}}, // Вправо* | Вверх-Влево  | ^Нижний край.
        {{-1,  0}, {+1, -1}, { 0,  0,  0, -1}}, // Вверх*  | Вниз-Влево   | <Правый край.
    };
 
    size_t m, n;
    cin >> m >> n;
 
    Matrix a = Matrix(m, Row(n));
 
    // Заполнение матрицы по указанному пути обхода.
    int it = 1;
    traversal(a, {0, static_cast<long>(n - 1)}, u_form, [&it](int &x) { x = it++; });
 
    // Вывод заполненной матрицы.
    cout << to_string(a) << endl;
 
    // Вывод элементов в порядке следования по указанному пути обхода.
    traversal(a, {0, static_cast<long>(n - 1)}, u_form, [](int &x) { cout << x << " "; });
    cout << endl;
 
    return 0;
}
Пример с обходом по спирали

Поскольку функция получилась относительно универсальной, можно сделать и другие варианты обхода от края к центру. Например, по спирали.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const vector<Step> spiral_form = {
//    di  dj   ->i ->j     t   l   b   r
    {{+1,  0}, {-1, -1}, { 0,  0,  0, -1}}, // Вниз*   | Вверх-Влево  | <Правый край.
    {{ 0, -1}, {-1, +1}, { 0,  0, -1,  0}}, // Влево*  | Вверх-Вправо | ^Нижний край.
    {{-1,  0}, {+1, +1}, { 0, +1,  0,  0}}, // Вверх*  | Вниз-Вправо  | >Левый край.
    {{ 0, +1}, {+1, -1}, {+1,  0,  0,  0}}, // Вправо* | Вниз-Влево   | vВерхний край.
};
 
size_t m, n;
cin >> m >> n;
 
Matrix a = Matrix(m, Row(n));
 
// Заполнение матрицы по указанному пути обхода.
int it = 1;
traversal(a, {0, static_cast<long>(n - 1)}, spiral_form, [&it](int &x) { x = it++; });
 
// Вывод заполненной матрицы.
cout << to_string(a) << endl;
1
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
26.02.2019, 20:28
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
#include <iostream>
#include <sstream>
using namespace std;
 
int main()
{
 string str="04 14 24 34 44 43 42 41 40 30 20 10 00 01 11 21 31 32 33 23 13 03 02 12 22";
 stringstream s(str);
 int arr[5][5];
 int n;
 
 for(int i=0;i<5;i++){
    for(int j=0;j<5;j++){
       arr[i][j]=i+j;
       cout<<arr[i][j]<<"  ";
      }
    cout<<"\n";
  }
 cout<<"\n\n\n";
 while(s>>n)
   cout<< arr[n/10][n%10]<<"  ";
 cout<<"\n";
 
  system("pause");
  return 0;
}
0
2 / 2 / 0
Регистрация: 01.10.2018
Сообщений: 210
26.02.2019, 22:08  [ТС]
valen10,я валенок и тз не указал но вот как должен выглядеть каркас( преподаватель не принимает никакие другие варианты((
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
#include "pch.h" 
#include <iostream> 
#include <math.h> 
#include <iomanip> 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int  n, i, j, k, l;
    cout << "введите размерность массива" << endl;
    cin >> n;
    int m = n * n;
    int* b = new int[n*n];
    int** Mas = new int *[n];
    for (int i = 0; i < n; ++i)
        Mas[i] = new int[n];
 
    cout << "Enter\n";
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cin >> Mas[i][j];
        }
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << Mas[i][j] << " ";
        }
        cout << "\n";
    }
    // тут нужно присвоить массиву b значения из двумерного массива Mas как показано на картинке
    cout << "полученный массив" << endl;
    for (int H = 0; H < m; H++)
    {
        cout << b[H];
    }
 
    return(0);
}
Добавлено через 19 минут
повар1, Можешь объяснить что происходит здесь ? ( мне нужно сначала присвоить значения двумерного массива в этом порядке, а потом вывести их)
C++
1
2
3
while(s>>n)
   cout<< arr[n/10][n%10]<<"  ";
 cout<<"\n";
0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
26.02.2019, 22:49
У нас есть строка в которой указан путь обхода массива. В этой строке например значение 04 означает: 0 - i строка, 4 - j элемент. Эту стоку вводим в поток ввода-вывода s. Из потока выводим с помощью while(s>>n) значения ij в int n (пробел в строке это разделитель значений). Если n/10 то получим индекс i. Если n%10 то получим индекс j.

Добавлено через 8 минут
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
#include <iostream>
#include <sstream>
using namespace std;
 
int main()
{
 string str="04 14 24 34 44 43 42 41 40 30 20 10 00 01 11 21 31 32 33 23 13 03 02 12 22";
 stringstream s(str);
 int arr[5][5];
 int b[25];
 int n;
 
 for(int i=0;i<5;i++){
    for(int j=0;j<5;j++){
       arr[i][j]=i+j;
       cout<<arr[i][j]<<"  ";
      }
    cout<<"\n";
  }
 cout<<"\n\n\n";
 int i=0;
 while(s>>n){
   b[i]=arr[n/10][n%10];
   cout<<b[i]<<"  ";
   i++;
 }
 
 cout<<"\n";
 
  system("pause");
  return 0;
}
0
2 / 2 / 0
Регистрация: 01.10.2018
Сообщений: 210
27.02.2019, 17:13  [ТС]
повар1, а можешь сделать тот же вывод но для этого кода? Я просто вообще не догоняю что то, а препод просит оформить именно в такой форме((
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
#include "pch.h" 
#include <iostream> 
#include <math.h> 
#include <iomanip> 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int  n, i, j, k, l;
    cout << "введите размерность массива" << endl;
    cin >> n;
    int m = n * n;
    int* b = new int[n*n];
    int** Mas = new int *[n];
    for (int i = 0; i < n; ++i)
        Mas[i] = new int[n];
 
    cout << "Enter\n";
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cin >> Mas[i][j];
        }
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << Mas[i][j] << " ";
        }
        cout << "\n";
    }
    // тут нужно присвоить массиву b значения из двумерного массива Mas как показано на картинке
    cout << "полученный массив" << endl;
    for (int H = 0; H < m; H++)
    {
        cout << b[H];
    }
 
    return(0);
}
0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
27.02.2019, 18:48
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
#include <iostream>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int  n=5;
    int bypass[25]={4,14,24,34,44,43,42,41,40,30,20,10,0,1,11,21,31,32,33,23,13,3,2,12,22};
 
    int* b = new int[n*n];
    int** Mas = new int *[n];
    for (int i = 0; i < n; ++i)
        Mas[i] = new int[n];
 
    cout << "Enter\n";
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
             cin >> Mas[i][j];
        }
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << Mas[i][j] << " ";
        }
        cout << "\n";
    }
    for (int H = 0; H < 25; H++)
    {
         b[H]=Mas[bypass[H]/10][bypass[H]%10];
    }
    cout << "полученный массив" << endl;
    for (int H = 0; H < 25; H++)
    {
        cout << b[H]<<"  ";
    }
  return 0;
}
0
2 / 2 / 0
Регистрация: 01.10.2018
Сообщений: 210
27.02.2019, 19:04  [ТС]
повар1, есть еще один момент, двумерный массив динамический. там может быть 1 2 3 4 5 6 или более строк и столбцов. А тут только для статического
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
27.02.2019, 21:12
Лучший ответ Сообщение было отмечено DrKappa как решение

Решение

Цитата Сообщение от DrKappa Посмотреть сообщение
А тут только для статического
Только это заметили? Логично же, что в строке жестко прописан порядок обхода только для массива 5x5. Странно, что из двух предложенных вариантов вами был выбран наименее подходящий.

Не знаю, что там еще запрещает ваш преподаватель, разрешены ли функции и структуры. Максимально упростил. Если еще и enum под запретом, замените его на обычные константы со значениями от 0 до 7 в порядке перечисления.
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
82
83
84
85
86
#include <iostream>
using namespace std;
 
int main() {
//    setlocale(LC_ALL, "Russian");
    int n;
    cout << "Введите размер массива" << endl;
    cin >> n;
 
    int m = n * n;
    int* b = new int[m];
    int** a = new int* [n];
    for (int i = 0; i < n; ++i) {
        a[i] = new int[n];
    }
 
    cout << "Matrix:" << endl;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> a[i][j];
        }
    }
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cout.width(4);
            cout << a[i][j] << " ";
        }
        cout << endl;
    }
 
    // тут нужно присвоить массиву b значения из двумерного массива Mas как показано на картинке
    enum {mov_i, mov_j, ret_i, ret_j, ch_top, ch_left, ch_bottom, ch_right};
    int step_list[][8] = {
    //   di  dj    ->i ->j     t   l   b   r
        {+1,  0,    -1, -1,    0,  0,  0, -1}, // Вниз*   | Вверх-Влево  | <Правый край.
        { 0, -1,    -1, +1,    0,  0, -1,  0}, // Влево*  | Вверх-Вправо | ^Нижний край.
        {-1,  0,    +1, +1,    0, +1,  0,  0}, // Вверх*  | Вниз-Вправо  | >Левый край.
        {+1,  0,    -1, +1,    0, +1,  0,  0}, // Вниз*   | Вверх-Вправо | >Левый край.
        { 0, +1,    -1, -1,    0,  0, -1,  0}, // Вправо* | Вверх-Влево  | ^Нижний край.
        {-1,  0,    +1, -1,    0,  0,  0, -1}  // Вверх*  | Вниз-Влево   | <Правый край.
    };
 
    int pos_i = 0;
    int pos_j = n - 1;
    int top = 0;
    int left = 0;
    int bottom = n - 1;
    int right = n - 1;
    int insert_pos = 0;
 
    while ((top <= bottom) && (left <= right)) {
        for (const auto &step : step_list) {
            // Если позиция не была исправлена,
            if ((top > bottom) || (left > right) || (pos_i < top) || (pos_i > bottom) || (pos_j < left) || (pos_j > right)) {
                // значит обход не может быть продолжен.
                break;
            }
 
            while ((pos_i >= top) && (pos_i <= bottom) && (pos_j >= left) && (pos_j <= right)) {
                b[insert_pos++] = a[pos_i][pos_j];
 
                // Перемещение текущей позиции.
                pos_i += step[mov_i];
                pos_j += step[mov_j];
            }
 
            // Исправление некорректной позиции.
            pos_i += step[ret_i];
            pos_j += step[ret_j];
 
            // Изменение размера области обхода.
            top += step[ch_top];
            left += step[ch_left];
            bottom += step[ch_bottom];
            right += step[ch_right];
        }
    }
 
    cout << "Полученный массив: " << endl;
    for (int i = 0; i < m; i++) {
        cout << b[i] << " ";
    }
 
    return(0);
}
1
2 / 2 / 0
Регистрация: 01.10.2018
Сообщений: 210
27.02.2019, 22:42  [ТС]
valen10, я валенок еще тот и знаю что прошу слишком много, но все же если у вас есть свободное время объясните пожалуйста : как значения из step_list присваиваются элементам enum, что это значит
C++
1
while ((top <= bottom) && (left <= right))
, Как работает исправление некорректной позиции, почему переменная bottom и right равны n-1 и
C++
1
while ((top <= bottom) && (left <= right))
как это работает?

Добавлено через 13 минут
valen10, и
C++
1
2
3
4
5
6
7
 while ((pos_i >= top) && (pos_i <= bottom) && (pos_j >= left) && (pos_j <= right)) {
                b[insert_pos++] = a[pos_i][pos_j];
 
                // Перемещение текущей позиции.
                pos_i += step[mov_i];
                pos_j += step[mov_j];
            }
как это работает? как происходит смена mov i и mov j ?
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
28.02.2019, 00:31
Цитата Сообщение от DrKappa Посмотреть сообщение
как значения из step_list присваиваются элементам enum
Где? В enum, грубо говоря, хранятся именованные константы. Здесь они используются для доступа к одному из элементов массива без использования магических чисел.

Цитата Сообщение от DrKappa Посмотреть сообщение
что это значит
C++
1
while ((top <= bottom) && (left <= right))
Проверка правильности границ. Номер верхней строки не может быть больше номера нижней. Номер левого столбца не может быть больше номера правого. Возможно, это и не обязательно проверять (подумать надо). По сути, если границы будут не правильными, тогда и текущая позиция не будет в них попадать ни при каком условии. Можно и на while (true) заменить. Наверное.

Цитата Сообщение от DrKappa Посмотреть сообщение
почему переменная bottom и right равны n-1
Отвечу вопросом на вопрос: как соотносятся между собой количество элементов массива и максимальный индекс этого же массива?

Цитата Сообщение от DrKappa Посмотреть сообщение
как это работает?
Устанавливаются границы (top, left, bottom, right), фиксируется текущая позиция (pos_i, pos_j). И дальше в цикле изменяется текущая позиция, пока это возможно. Каждая строка массива step_list содержит 8 чисел: 1е и 2е - это изменение текущей позиции. Изменение позиции выполняется до тех пор, пока она не выскочит за установленные границы. После этого используются 3е и 4е числа - восстановление правильной позиции. Это два действия: шаг назад и шаг в правильном направлении. И после этого используются последние четыре числа - изменение границ. После прохода вдоль одной из границ её необходимо сдвинуть в направлении к центру.

1
2 / 2 / 0
Регистрация: 01.10.2018
Сообщений: 210
28.02.2019, 14:52  [ТС]
valen10, а тут
C++
1
for (const auto &step : step_list)
мы определяем тип данных в step_list или?
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
28.02.2019, 23:53
Цитата Сообщение от DrKappa Посмотреть сообщение
мы определяем тип данных в step_list или?
Здесь просто по порядку просматриваются все строки массива в цикле range-based for. Спецификатор auto позволяет не писать тип данных вручную (здесь это должен быть int[8]).
0
2 / 2 / 0
Регистрация: 01.10.2018
Сообщений: 210
01.03.2019, 18:15  [ТС]
valen10, при обходе матрицы больше 5 возникает проблемка, после обхода правой, нижней и левой стенки дальше массив должен закручиваться змейкой в центр. При обходе массива больше 5 он на 7 обходе ломает эту змейку и идет иначе? Как можно это поправить?
Миниатюры
Массив: Вывести массив по заданной схеме...  
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
01.03.2019, 18:38
DrKappa, вот это поворот! Разве обходы не должны чередоваться? По вашему рисунку это не понятно. Сделайте тогда рисунок для 7 и 8, например, чтобы уточнить этот момент.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
01.03.2019, 18:48
Цитата Сообщение от DrKappa Посмотреть сообщение
При обходе массива больше 5 он на 7 обходе ломает
ничего не ломает, присмотритесь, это исходный массив "сломан"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.03.2019, 18:48
Помогаю со студенческими работами здесь

Массив: Сформировать квадратную матрицу порядка n по заданной схеме...
Помогите пожалуйста, нужно чтобы матрица выводилась в этом виде #include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; ...

Сортировка: Как сделать так, чтобы двумерный массив выводился по заданной схеме...
Помогите.Как сделать так, что бы двумерный массив выводился так : . . . 3 . ... 6 1 2 9 4 5 12 7 8 . 10 11

Массив: Создать двумерный массив, заполнив его согласно заданной схеме

Заполнить массив по заданной схеме
Заполнить массив следующим образом: \begin{pmatrix} 1&amp; 2&amp; 3&amp; 4&amp; 5&amp; 6&amp; 7&amp; 8&amp; 9&amp; 10&amp; \\ 20&amp; 19&amp; 18&amp; 17&amp; 16&amp; ...

Заполнить массив по заданной схеме
Двумерный массив: 1 1 1 1 1 1 1 2 3 4 5 6 1 3 6 10 15 21 1 4 10 20 25 56 1 5 15 35 70 126 1 6 21 56 126 252


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru