0 / 0 / 0
Регистрация: 13.11.2017
Сообщений: 30
1

Заполнить матрицу змейкой по спирали

23.12.2018, 06:52. Показов 2271. Ответов 1
Метки нет (Все метки)

Необходимо создать змейку типа
1 2 3 4 5 6
36 35 34 33 32 7
19 20 21 22 31 8
18 25 24 23 30 9
17 26 27 28 29 10
16 15 14 13 12 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
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
#include <iostream>
#include <iomanip> 
using namespace std;
 
int main()
{
    int n;
    int m;
    cout << "Vvediterazmer rebra h = ";
    cin >> n;
 
    m = n;
 
    int** Mas = new int *[n]; //Создание динамического массива
    for (int i = 0; i < n; i++) //для матрицы m*n
        Mas[i] = new int[m];
 
    int i = 0, j, k = -1, p = 1;
 
    while (p != n*(m / 2 + 1))
    {
        k=k+2;
        for (j = k - 1; j<m - k + 1; j++)
        {
            Mas[k - 1][j] = p++; //Определение значений верхнего горизонтального столбца 
            i++;
        }
 
        for (j = k; j<n - k + 1; j++)
        {
            Mas[j][m - k] = p++; // По правому вертикальному столбцу
            i++;
        }
 
        for (j = m - k - 1; j >= k - 1; j--)
        {
            Mas[n - k][j] = p++; // по нижнему горизонтальному столбцу
            i++;
        }
 
        for (j = n - k - 1; j > k; j--)
        {
            Mas[j][k - 1] = p++; // по левому вертикальному столбцу
            i++;
        }
 
}
 
    while (p <=(n*m - n*(m / 2 + 1)))
    {
        
        for (j = k-1 ; j<=m - k ; j++)
        {
            Mas[k ][j] = p++; //Определение значений верхнего горизонтального столбца 
            i++;
        }
 
        for (j = n - k ; j > k-1; j--)
        {
            Mas[j][k ] = p++; // по правому вертикальному столбцу
            i++;
        }
 
        for (j = m - k ; j >= k - 1; j--)
        {
            Mas[n - k-1][j] = p++; // по нижнему горизонтальному столбцу
            i++;
        }
 
        for (j = k-1; j<n - k + 1; j++)
        {
            Mas[j][m - k] = p++; // По левому вертикальному столбцу
            i++;
        }
 
            k = k - 2;
    }
 
 
    for (int i = 0; i<n; i++)
    {
        for (int j = 0; j<m; j++)
        {
            cout << setw(4) << Mas[i][j]; // выводим полученную матрицу
        };
        cout << endl;
    }
    for (i = 0; i < n; i++) // освобождение динамической памяти
        delete[] Mas[i];
    delete[] Mas;
 
    cin.get(); cin.get();
    return(0);
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.12.2018, 06:52
Ответы с готовыми решениями:

Заполните матрицу натуральными числами по спирали и змейкой
Заполните матрицу, содержащую N строк и M столбцов, натуральными числами по спирали и змейкой, то...

Заполнить матрицу змейкой
Напишите программу, которая заполняет матрицу из N строк и M столбцов натуральными числами змейкой,...

Заполнить матрицу змейкой
Напишите программу, заполняющую матрицу nxn (значение значение n вводить с клавиатуры) по правилу,...

Заполнить матрицу змейкой
25 24 23 22 21 16 17 18 19 20 15 14 13 12 11 6 7 8 9 10 5 4 3 2 1 int main(){

1
5 / 2 / 3
Регистрация: 19.12.2018
Сообщений: 7
23.12.2018, 16:01 2
Лучший ответ Сообщение было отмечено Skripan как решение

Решение

Вы же программист, вы должны упрощать жизнь себе и другим. Я сомневаюсь, что позже вы захотите вернуться к такому коду. Очень легко при таком стиле что-то пропустить. Вынесли бы повторяющиеся части в функции (хотя бы) и копипастить уже меньше, да и проверять проще.
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
#include <iostream>
#include <iomanip>
 
using namespace std;
 
void _up(int **arr, int size, int &x, int &y, int stepCount = -1)
{
    int curNum = arr[y][x];
    while(y && stepCount && !arr[y - 1][x] )
    {
        arr[--y][x] = ++curNum;
        --stepCount;
    }
}
void _down(int **arr, int size, int &x, int &y, int stepCount = -1)
{
    int curNum = arr[y][x];
    --size;
    while((y < size) && stepCount && !arr[y + 1][x] )
    {
        arr[++y][x] = ++curNum;
        --stepCount;
    }
}
void _left(int **arr, int size, int &x, int &y, int stepCount = -1)
{
    int curNum = arr[y][x] + 1;
    while(x && stepCount && !arr[y][x - 1] )
    {
        arr[y][--x] = curNum++;
        --stepCount;
    }
}
void _right(int **arr, int size, int &x, int &y, int stepCount = -1)
{
    int curNum = arr[y][x];
    --size;
    while((x < size) && stepCount && !arr[y][x + 1] )
    {
        arr[y][++x] = ++curNum;
        --stepCount;
    }
}
 
int main()
{
    int posX    = 0,
        posY    = 0,
        indent  = 1,
        finalElementsCount,
        size;
    cout << "Enter the size of array: ";
    cin  >> size;
    finalElementsCount = size*size;
    while(finalElementsCount)
    {
        finalElementsCount /= 10;
        indent++;
    }
    int **array = new int*[size];
    for(int i = 0; i < size; i++)
    {
        array[i] = new int[size];
        for(int j = 0; j < size; j++)
        {
            array[i][j] = 0;
        }
    }
    array[posY][posX] = 1;
 
    _right(array, size, posX, posY);
    _down (array, size, posX, posY);
    _left (array, size, posX, posY);
    _up   (array, size, posX, posY, 3);
    _right(array, size, posX, posY, 3);
    _down (array, size, posX, posY, 1);
    _left (array, size, posX, posY);
    _down (array, size, posX, posY);
    _right(array, size, posX, posY);
    _up   (array, size, posX, posY);
    _left (array, size, posX, posY);
 
    for(int i = 0; i < size; i++)
    {
        for(int j = 0; j < size; j++)
        {
            cout << setw(indent) << array[i][j];
        }
        cout << '\n';
        delete [] array[i];
    }
    delete [] array;
    return(0);
}
Я не говорю, что это особо удачное решение, и его нужно брать в пример. Просто небольшой намек на то, что некоторые вещи могут быть достигнуты без головной боли. Написав одну функцию и проверив её на корректность работы, возвращаться к ней мне уже не придется, ведь я точно знаю, что она делает то, что должна.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2018, 16:01
Помогаю со студенческими работами здесь

Заполнить матрицу змейкой
Нужно заполнить квадратный двухмерный масив змейкой и вывести. 1 2 3 6 5 4 7 8 9

Заполнить матрицу змейкой
1 8 9 16 2 7 10 16 3 6 11 14 4 5 12 13

Заполнить матрицу змейкой
Простая задача. Заполнить матрицу змейкой. Я совершенный новичок. Только начали проходить функции,...

Заполнить квадратную матрицу змейкой
заполнить квадратную матрицу NxN змейкой С++ вот так: 25 24 23 22 21 16 17 18 19 20 15 14 13...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru