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

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

24.10.2017, 16:44. Показов 4862. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите с задачей
Входные данные
Входная строка содержит числа N и M , разделённые пробелом

Выходные данные
Программа должна вывести матрицу, заполненную заданным способом.

Примеры
входные данные
4 5
выходные данные
1 3 4 10 11
2 5 9 12 17
6 8 13 16 18
7 14 15 19 20

Добавлено через 24 минуты
Вот один тип змейки, аля вниз-право-вверх
1 8 9 16 17
2 7 10 15 18
3 6 11 14 19
4 5 12 13 20
#include <iostream>
using namespace std;
int main()
{
int a[101][101],s,h,i,j;
cin>>s>>h;
for(i=1;i<=s;i++)
for(j=1;j<=h;j++)
if (j%2==0) a[i][j]=j*s-i+1;
else if (j%2!=0) a[i][j]=(j-1)*s+i;
for(i=1;i<=s;i++)
{
for(j=1;j<=h;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
cin.get();
cin.get();
return 0;
}

Помогите перевести эту программу в тип:
1 3 4 10 11
2 5 9 12 17
6 8 13 16 18
7 14 15 19 20
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.10.2017, 16:44
Ответы с готовыми решениями:

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

Заполнить матрицу последовательными натуральными числами
1.Сформировать матрицу по следующему правилу 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

Заполнить квадратную матрицу натуральными числами по спирали
Составить программу, которая заполняет квадратную матрицу порядка n натуральными числами 1, 2, 3,...

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

4
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
24.10.2017, 21:27 2
DenisCherkisov, здравствуйте! Я решил вашу проблему, но, так как торопился, условия после спуска и подъема в матрице получились довольно громоздкими. Однако, задача прошла все тесты. Если вам нужно меньше кода, пишите, я подумаю, что можно сделать. Кстати, если кто-то найдет более простые условия после спуска и подъема (смотреть комментарии) буду премного благодарен!

Мой код:

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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <iostream>
 
using namespace std;
 
int main()
{
    int N, M, x, y, k;
    cin >> N >> M;
    int** A = new int*[N+2];
    for (int i = 0; i < N + 2; i++)
    {
        A[i] = new int[M+2];
    }
    for (int i = 0; i < N + 2; i++)
    {
        for (int j = 0; j < M + 2; j++)
        {
            if ((i == 0) || (i == N + 1) || (j == 0) || (j == M + 1))
                A[i][j] = 1;
            else
                A[i][j] = 0;
        }
    }
 
    x = y = 1;
    A[x][y] = 0;
    k = 0;
    for (int i = 0; i < 100; i++)
    {
        //Спуск вниз
        
        while (A[x][y] != 1)
        {
            k++;
            A[x][y] = k;
            x++;
            y--;
        }
 
        if (A[x][y] == N * M)
            break;
 
        //Действия слева, снизу (после спуска)
 
        if ((A[x-1][y] == 1) && (A[x][y+1] == 1))
        {
            y += 2;
            x--;
            A[x][y] = k + 1;
        }
        else if ((A[x][y-1] == 1) && (A[x][y+1] == 1))
        {
            y += 2;
            x--;
            A[x][y] = k + 1;
        }
        else if (A[x+1][y] == 1)
        {
            y++;
            A[x][y] = k + 1;
        }
        else if (A[x][y+1] == 1)
        {
            y += 2;
            x--;
            A[x][y] = k + 1;
        }
 
        if (A[x][y] == N * M)
            break;
 
        //Подъем наверх
 
        while (A[x][y] != 1)
        {
            k++;
            A[x][y] = k;
            x--;
            y++;
        }
 
        if (A[x][y] == N * M)
            break;
 
        //Действия справа, сверху (после подъема)
 
        if ((A[x][y-1] == 1) && (A[x+1][y] == 1))
        {
            x += 2;
            y--;
            A[x][y] = k + 1;
        }
        else if (A[x][y+1] == 1)
        {
            x++;
            A[x][y] = k + 1;
        }
        else if (A[x+1][y] == 1)
        {
            x += 2;
            y--;
            A[x][y] = k + 1;
        }
        if (A[x][y] == N * M)
            break;
    }
 
    //Вывод матрицы
 
    for (int i = 1; i < N + 1; i++)
    {
        for (int j = 1; j < M + 1; j++)
        {
            cout.width(3);
            cout << A[i][j] << " ";
        }
        cout << endl;
    }
 
    for (int i = 0; i < N + 2; i++)
    {
        delete [] A[i];
    }
    delete [] A;
    system("pause");
    return 0;
}
1
299 / 208 / 174
Регистрация: 11.05.2016
Сообщений: 655
25.10.2017, 00:16 3
Можно как-то так еще:

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
#include <iostream>
 
int main(void)
{
    int m, n, max_diag, cM, cN, even;
    int counter = 1;
 
    int arr[101][101];
 
    std::cin >> m;
    std::cin >> n;
    max_diag = (m > n ? n : m );
    even = n%2;
 
    for(int i=0; i<n; i++)
    {
        cM = 0;
        cN = i;
        int curr_diag = (i >= max_diag ? max_diag : i+1);
 
        while(curr_diag)
        {
            arr[cM][cN] = counter+(((i+1)%2)*(curr_diag-1 - (cM)));
            cM++;
            cN--;   
            curr_diag--;
            counter++;
        }   
    }
 
    for(int i=1; i<m; i++)
    {
        cM = i;
        cN = n-1;
        int curr_diag = (m-i > max_diag ? max_diag : m-i);
        while(curr_diag)
        {
            
            arr[cM][cN] = counter+(((i+even)%2)*(curr_diag-1 - (cM-i)));
            cM++;
            cN--;   
            curr_diag--;
            counter++;
        }   
    }
    
    std::cout << "\n\n";
 
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            std::cout << arr[j][i] << " ";
        }
        std::cout << "\n";
    }
 
    system("pause");
    return(0);
}
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
25.10.2017, 01:05 4
Ну, если времени не жалко, можно и 100500 строк с if-ами написать, а можно весь код уложить в десяток строк.
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
#include <iostream>
using namespace std;
int main()
{
    int N, M;
    cin >> N >> M;
    int** A = new int*[N];
    for (int i = 0; i < N; i++)
        A[i] = new int[M];
    for (int x = 0, y = 0, dx = 1, cnt=0; !(x-dx == N-1 && y+dx == M-1); x += dx, y -= dx)
    {
        bool chgd = false;
        if (y < 0) 
            y += dx, chgd = true;
        if (y == M) 
            y += dx, x -= dx + dx, chgd = true;
        if (x < 0) 
            x -= dx, chgd = true;
        if (x == N) 
            x -= dx, y += chgd?dx:dx + dx, chgd = true;
        if (chgd) dx = -dx;
        A[x][y] = ++cnt;
    }
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
            cout << " " << A[j][i];
        cout << endl;
    }
    return 0;
}
0
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
25.10.2017, 17:45 5
Kuzia domovenok, здравствуйте! Спасибо за ваше замечание. Эту задачу решаю во второй раз за все изучение С++. Первый мой вариант намного хуже. Других методов решения таких задач пока не знаю. Вот, что удалось сделать с моим кодом выше (теперь, вроде, смотрится более элегантно):

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
109
110
111
112
113
#include <iostream>
 
using namespace std;
 
int main()
{
    int N, M, x, y, k;
    cin >> N >> M;
    int** A = new int*[N+2];
    for (int i = 0; i < N + 2; i++)
    {
        A[i] = new int[M+2];
    }
    for (int i = 0; i < N + 2; i++)
    {
        for (int j = 0; j < M + 2; j++)
        {
            if ((i == 0) || (i == N + 1) || (j == 0) || (j == M + 1))
                A[i][j] = 1;
            else
                A[i][j] = 0;
        }
    }
 
    x = y = 1;
    A[x][y] = 0;
 
    k = 0;
    for (int i = 0; i < 100; i++)
 
    {
 
        //Спуск вниз
 
        while (A[x][y] != 1)
        {
            k++;
            A[x][y] = k;
            x++;
            y--;
        }
 
        if (A[x][y] == N * M)
            break;
 
        //Действия слева, снизу
 
        if ((A[x-1][y] == 1 && A[x][y+1] == 1) || (A[x][y+1] == 1))
        {
            x--;
            y += 2;
            A[x][y] = k + 1;
        }
        else
        {
            y++;
            A[x][y] = k + 1;
        }
        
        if (A[x][y] == N * M)
            break;
 
        //Подъем наверх
 
        while (A[x][y] != 1)
        {
            k++;
            A[x][y] = k;
            x--;
            y++;
        }
 
        if (A[x][y] == N * M)
            break;
 
        //Действия справа, сверху
 
        if ((A[x][y-1] == 1 && A[x+1][y] == 1) || (A[x+1][y] == 1))
        {
            x += 2;
            y--;
            A[x][y] = k + 1;
        }
        else
        {
            x++;
            A[x][y] = k + 1;
        }
        
        if (A[x][y] == N * M)
            break;
    }
 
    //Вывод матрицы
 
    for (int i = 1; i < N + 1; i++)
    {
        for (int j = 1; j < M + 1; j++)
        {
            cout.width(2);
            cout << A[i][j] << " ";
        }
        cout << endl;
    }
 
    for (int i = 0; i < N + 2; i++)
    {
        delete [] A[i];
    }
    delete [] A;
    system("pause");
    return 0;
}
0
25.10.2017, 17:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.10.2017, 17:45
Помогаю со студенческими работами здесь

Улитка.Матрицу M (m,n) заполнить натуральными числами от 1 до m*n по спирали, начинающей в левом верх
Помогите пожалуйста решить задачу по BORLAND С++ Улитка.Матрицу M (m,n) заполнить натуральными...

Заполнить матрицу 9x9 случайными числами. Отобразить матрицу симметрично относительно главной диагонали
Заполнить матрицу случайными числами. Отобразить матрицу симметрично относительно главной диагонали

Заполнить матрицу числами по диагонали
За данными числам n и m заполнить двумерный массив размером n × m числами от 1 до n × m...

Заполнить квадратную матрицу змейкой по диагонали, начиная с элемента matrix[size-1][size-1]
Требуется написать программу, которая заполняет массив размерности n*n по заданному правилу: ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru