Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
Toshik_
1 / 1 / 0
Регистрация: 17.08.2013
Сообщений: 91
#1

Двухмерный массив (заполнить змейкой квадратную матрицу) - C++

23.09.2013, 16:18. Просмотров 2371. Ответов 4
Метки нет (Все метки)

Требуется заполнить змейкой квадратную матрицу так, как показано на рисунке справа: заполнение происходит с единицы из левого верхнего угла и заканчивается в правом нижнем числом N^2, где N – порядок матрицы.

Входные данные
Во входном файле INPUT.TXT задано натуральное число N – размер квадратной матрицы (N<=100).

Выходные данные
В выходной файл OUTPUT.TXT выведите матрицу, заполненную числами от 1 до N^2 змейкой, при этом между числами может быть любое количество пробелов

Пример
INPUT.TXT
4

OUTPUT.TXT
1 3 4 10
2 5 9 11
6 8 12 15
7 13 14 16

Помогите пожалуйста сделать реализацию

Добавлено через 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
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main()
{
    ifstream in("INPUT.TXT");
    int n, i,t,p=0, s0=1, t2=2;
    in >> n;
    int **mas=new int *[n];
    for(i=0; i<n; i++)
        for(t=0; t<n; t++)
            mas[i]=new int [t];
    mas[n-1][n-1]=-1;
    if(mas[n-1][n-1]!=n*n){
        if(mas[n-1][0]>0){
            s0--;
            p=n;}
        else {
            p++;
            s0++;}
    for(i=p; i>=0; i--)
        for(t=0; t<s0; t++)
            mas[i][t]=t2;
    }
 
    mas[0][0]=1;
    for(i=0; i<n; i++){
        for(t=0; t<n; t++)
            cout << mas[i][t] << ' ';
        cout << endl;
    }
    system("pause");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.09.2013, 16:18     Двухмерный массив (заполнить змейкой квадратную матрицу)
Посмотрите здесь:

Заполнить квадратную матрицу 10 на 10 змейкой - C++
заполнить квадратную матрицу 10 на 10 змейкой С++ вот так: 91 92 93 94...98 99 100 90 89 88 87...83 82 81 . . . 11 12 13...

Заполнить квадратную матрицу змейкой - C++
заполнить квадратную матрицу NxN змейкой С++ вот так: 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

Заполнить квадратную матрицу змейкой - C++
Задано число N. Заполните квадратную матрицу NxN числами от 1 до N^2 “змейкой”, как показано в примере. 4 1 8 9 16 2 7 10 15...

Требуется заполнить змейкой квадратную матрицу так, как показано на рисунке - C++
Требуется заполнить змейкой квадратную матрицу так, как показано на рисунке справа: заполнение происходит с единицы из левого верхнего угла...

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

Cоздать и заполнить массив строк в стиле Си (квадратную матрицу указателей на char) - C++
Нужно создать массив символьных указателей на 10 элементов и выполните вывод всех строк в 10 столбиков Нужно заполнить массив...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gubila_2000
0 / 0 / 0
Регистрация: 07.11.2014
Сообщений: 166
Записей в блоге: 1
05.06.2015, 21:02     Двухмерный массив (заполнить змейкой квадратную матрицу) #2
То же наткнулся на эту задачу, у меня работает только для размерности 4х4. Подсткажите агоритм наиболее универсального заполения
ArtFeather
13 / 13 / 9
Регистрация: 04.06.2015
Сообщений: 85
06.06.2015, 10:28     Двухмерный массив (заполнить змейкой квадратную матрицу) #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
#include <iostream>
#include <conio.h>
 
using namespace::std;
 
const int n = 4, m = 6;
int a[n][m];
 
void rows(int n, int m) { // Заполнение по горизонтали
        int k=0;
    for (int i = 0; i<n; i++)
    for (int j = 0; j<m; j++) {
        a[i][j] = (i % 2 ? (i + 1)*m - j - 1 : k);
        k++;
    }
}
 
void cols(int n, int m) { // Заполнение по вертикале
        int k=0;
    for (int j = 0; j<m; j++)
    for (int i = 0; i<n; i++) {
        a[i][j] = (j % 2 ? (j + 1)*n - i - 1 : k);
        k++;
    }
}
 
void output(int n, int m) { // Очистка
    for (int i = 0; i<n; i++) {
        cout << endl;
        for (int j = 0; j<m; j++) cout << a[i][j] << " ";
    }
}
 
int main()
{
 
    rows(n, m);
    output(n, m);
    cols(n, m);
    output(n, m);
    _getch();
    return 0;
 
 
}
Добавлено через 1 час 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
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
#include <iostream>
#include <conio.h>
 
using namespace::std;
 
const int n = 10, m = 10; // n - кол-во столбиков; m - кол-во строк 
int a[100][100];
 
 
void diagonal(int n, int m)
{
    int x, y,  // Координаты текущего элемента массива
        value = 1; // значение, которым заполняется массив
 
    for (int i = 0; i < n; i++) 
    {
        if (i % 2 == 0) // по четным диагоналям
        {
            x = 0; // х-координата первого лемента массива на диагонали
            y = i; // у-координата элемента массива на диагонали
 
            while (y >= 0) // пока y-координата находится в верхней части диагонали
            {
                a[x][y] = value;
                value++;
                x++;   
                y--;   
            }
        }
        else // по нечетным диагоналям
        {
            x = i; // х-координата элемента массива на диагонали
            y = 0; // у-координата первого элемента массива на диагонали
 
            while (x >= 0) // пока x-координата находится в левой части диагонали
            {
                a[x][y] = value; 
                value++;
                x -= 1; 
                y += 1; 
            }
        }
    } 
 
    for (int i = 1; i < n; i++)
    {
        if (i % 2 == 0) // по четным диагоналям
        {
            x = 9; // х-координата первого элемента массива на диагонали - diag
            y = i;  // у-координата элемента массива на диагонали - diag
 
            while (y <= 9) // Пока не кончилась диагональ
            {
                a[x][y] = value;
                value++;
                x--; // по горизонтали, смещаемся влево
                y++; // по вертикали, смещаемся вниз
            }
        }
        else // по не четным диагоналям
        {
            x = i; // х-координата первого элемента к-ой диагонали
            y = 9;  // у-координата первого элемента к-ой диагонали
 
            while (x <= 9) // Пока не кончилась диагональ
            {
                a[x][y] = value;
                value++;
                x++; // по горизонтали, смещаемся вправо
                y--; // по вертикали, смещаемся вверх
            }
        } // конец if-else
    } // конец цикла for (заполнение второй половины массива)
 
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
            cout << a[i][j] << " ";
        cout << endl;
    }
 
}
 
int main()
{
    diagonal(n, m);
    _getch();
    return 0;
 
 
}
Bertul
Заблокирован
06.06.2015, 14:16     Двухмерный массив (заполнить змейкой квадратную матрицу) #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//init
const int size = 3;
    int init[size][size];
 
//result
    std::stack<int> delim;
    delim.push(1);
    for (int i = 1, index = 0, not = 1, count = 0, rev = 0; i <= std::pow(size, 2); i++){
        init[0][index] = i;
        if (count--)index += not*(size - 1); else
        {
            if (delim.size() == size)rev = 1;
            if (!rev)delim.push((delim.top() == 1) ? size : 1);
            index += delim.top();
            if (rev)delim.pop();
            count = delim.size() - 1;
            not *= -1;
        }
    }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2015, 19:27     Двухмерный массив (заполнить змейкой квадратную матрицу)
Еще ссылки по теме:

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

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

Заполнить матрицу змейкой - C++
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(){

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

Заполнить матрицу змейкой согласно условию - C++
Доброго времени суток,в общем,у меня такая проблема,не могу понять ,как сделать подобную задачу,пытался заполнить через rand , пытался...

Заполнить матрицу размером n*m змейкой по горизонтали, начиная движение от элемента matrix[0][0] - C++
Необходимо заполнить массив int a следующим образом (пример для n=4, m=6): Пытаюсь сделать вот так, но не получается: for(i=1;...


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

Или воспользуйтесь поиском по форуму:
Gubila_2000
0 / 0 / 0
Регистрация: 07.11.2014
Сообщений: 166
Записей в блоге: 1
06.06.2015, 19:27     Двухмерный массив (заполнить змейкой квадратную матрицу) #5
ArtFeather, четные и нечетные диагонали! Точно! Спасибо! Я эту закономерность не проследил видимо потому, что брал слишком маленькие массивы для контрольного примера.

Добавлено через 38 минут
ArtFeather, а, хотя нет, алгоритм нужно немного поменять, так как он работает немного неправильно с матрицами нечетной размерности. Это можно исправить поставив условие четности размерности, но таким образом код увеличится в 2 раза.

Добавлено через 21 минуту
вот я подправил. Программа прошла все тесты
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
#include <stdio.h>
 
#define n 101
 
unsigned a[n][n];
 
void matr_snake(int N)
{
    int i, x, y, k=1;
    
    for (i=0; i<N; i++) // первая половина
    {
        if (i%2==0) // по четным диагоналям
        {
            x=0;
            y=i;
 
            while (y>=0)
            {
                a[x][y]=k;
                x++; y--; k++;
            }
        }
        else // по нечетным
        {
            x=i; y=0;
            while (x>=0)
            {
                a[x][y]=k;
                k++; x--; y++;
            }
        }
    }
    if (N%2!=0){
    for (i=1; i<N; i++) // вторая половина
    {
        if (i%2==0)
        {
            x=i; y=N-1;
            while (x<=N-1)
            {
                a[x][y]=k;
                k++; x++; y--;
            }
        }
        else
        {
            x=N-1; y=i;
            while (y<=N-1)
            {
                a[x][y]=k;
                k++; x--; y++;
            }
        }
    }
    }
    else
    {
    for (i=1; i<N; i++) // вторая половина
    {
        if (i%2==0)
        {
            x=N-1; y=i;
            while (y<=N-1)
            {
                a[x][y]=k;
                k++; x--; y++;
            }
        }
        else
        {
            x=i; y=N-1;
            while (x<=N-1)
            {
                a[x][y]=k;
                k++; x++; y--;
            }
        }
    }
    }
}
 
 
void main()
{
    int N, i, x, y, k=1, p=0;
    // unsigned a[n][n];
    FILE *f;
 
    f = fopen ("INPUT.TXT", "r");
    fscanf(f, "%d", &N);
    fclose(f);
 
    matr_snake(N);
    
    
    f=fopen("OUTPUT.TXT", "w");
    for (x=0; x<N; x++){
        for (y=0; y<N; y++)
            fprintf(f, "%d ", a[x][y]);
            fprintf(f, "\n");
    }
    fclose(f);
}
Yandex
Объявления
06.06.2015, 19:27     Двухмерный массив (заполнить змейкой квадратную матрицу)
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru