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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
Toshik_
1 / 1 / 0
Регистрация: 17.08.2013
Сообщений: 91
23.09.2013, 16:18     Двухмерный массив (заполнить змейкой квадратную матрицу) #1
Требуется заполнить змейкой квадратную матрицу так, как показано на рисунке справа: заполнение происходит с единицы из левого верхнего угла и заканчивается в правом нижнем числом 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     Двухмерный массив (заполнить змейкой квадратную матрицу)
Посмотрите здесь:

C++ Заполнить матрицу змейкой
Заполнить квадратную матрицу размером N x N по спирали C++
C++ Заполнить матрицу змейкой
Заполнить квадратную матрицу следующим способом C++
C++ Заполнить квадратную матрицу 10 на 10 змейкой
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gubila_2000
 Аватар для Gubila_2000
0 / 0 / 0
Регистрация: 07.11.2014
Сообщений: 132
Записей в блоге: 1
05.06.2015, 21:02     Двухмерный массив (заполнить змейкой квадратную матрицу) #2
То же наткнулся на эту задачу, у меня работает только для размерности 4х4. Подсткажите агоритм наиболее универсального заполения
ArtFeather
 Аватар для 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;
        }
    }
Gubila_2000
 Аватар для Gubila_2000
0 / 0 / 0
Регистрация: 07.11.2014
Сообщений: 132
Записей в блоге: 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     Двухмерный массив (заполнить змейкой квадратную матрицу)
Ответ Создать тему
Опции темы

Текущее время: 16:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru