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

Заполнение матрицы спиралью - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.83
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
16.07.2011, 21:57     Заполнение матрицы спиралью #1
Доброго времени суток
На входе - N, на выходе - матрица NxN, заполненная спиралью(см. пример).
input.txt - 5
output.txt:
Код
1  2  3  4   5
16 17 18 19  6
15 24 25 20  7
14 23 22 21  8
13 12 11 10  9
Полное условие тут.
Есть одна идея - можно при каждой итерации цикла выполнять следующий код
C++
1
2
i += hi;
j += hj;
И, изменяя hi и hj, контролировать направление. Однако непонятно, при каком условии это направление изменять и главное - как узнать, когда заканчивать заполнение?
Буду рад даже просто алгоритму на словах.
Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2011, 21:57     Заполнение матрицы спиралью
Посмотрите здесь:

Заполнение матрицы C++
Заполнение матрицы! C++
Заполнение матрицы C++
C++ Заполнение матрицы
C++ Заполнение массива двойной спиралью
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
insolent
 Аватар для insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
16.07.2011, 22:01     Заполнение матрицы спиралью #2
Заполнение матрицы змейкой (по спирали)
http://www.cyberforum.ru/cpp-beginne...455-page2.html
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
16.07.2011, 22:05  [ТС]     Заполнение матрицы спиралью #3
Да, я гуглил по этому вопросу, но в нагугленном коде без поллитра разобраться не смогу =(
Поэтому и прошу скорее алгоритм, пачка циклов с безымянными переменными мне ни о чем не говорит. Можно и просто понятный код...
Вышевыложенные вообще не работают >_<
Nursik77
 Аватар для Nursik77
273 / 233 / 21
Регистрация: 05.04.2011
Сообщений: 645
16.07.2011, 22:25     Заполнение матрицы спиралью #4
Вот, нам препод когда-то решал:
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
#include<stdlib.h>
#include<stdio.h>
#define n 5
 
int main() {
int i=1,j,k,a[n][n],p=n/2;
//Г§Г*ïîëГ*ГҐГ*ГЁГҐ Г¬Г*òðèöû Г*óëÿìè
for(j=0;j<n;j++)
 for(k=0;k<n;k++)
  a[j][k]=0;
printf("\nMatrica razmerom (%d*%d)\n",n,n);
for(k=1;k<=p;k++)//kol-vo spiralei
{//verhn.goriz riyad
 for(j=(k-1);j<(n-k+1);j++)
  a[k-1][j]=i++;
//pravi verhn. stolbec
for(j=k;j<(n-k+1);j++)
 a[j][n-k]=i++;
//nizhni goriz riyad
for(j=(n-k-1);j>=k-1;j--)
 a[n-k][j]=i++;
//levi kraini stolbec
for(j=n-k-1;j>=k;j--)
 a[j][k-1]=i++;
}
 if (n%2)
  a[p][p]=n*n;
  
for(i=0;i<n;i++)
 for(j=0;j<n;j++)
  {printf("%5d",a[i][j]);
   if(j==(n-1))
  printf("\n");
 }
system("pause");
}
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
16.07.2011, 22:31  [ТС]     Заполнение матрицы спиралью #5
О, этот рабочий хотя бы...
Правда читабельность хромает, но попробую разобраться.
Спасибо
insolent
 Аватар для insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
16.07.2011, 23:46     Заполнение матрицы спиралью #6
Цитата Сообщение от diagon Посмотреть сообщение
Правда читабельность хромает
Это вам на фриленс нужно..
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2011, 23:55     Заполнение матрицы спиралью
Еще ссылки по теме:

C++ Заполнение матрицы
Вывод матрицы спиралью C++
C++ Заполнение матрицы спиралью - корректировка кода

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

Или воспользуйтесь поиском по форуму:
ruslan_abel
 Аватар для ruslan_abel
33 / 33 / 4
Регистрация: 06.05.2011
Сообщений: 91
16.07.2011, 23:55     Заполнение матрицы спиралью #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
#include <iostream>
#include <iomanip>
 
using std::cin;
using std::cout;
using std::endl;
 
using std::setw;
 
 
int main()
{
    //Кол-во строк и столбцов
    int n, m;
 
    //Матрица
    int** mtrx;
 
    int l, c;
 
    //Получаем от пользователя кол-во строк и столбцов
    cout << "N: ";
    cin >> n;
 
    cout << "M: ";
    cin >> m;
 
    //Выделяем память для элементов массива
    mtrx = new int*[n];
    for (int i = 0; i < n; i++)
        mtrx[i] = new int[m];
    
    //Виток спирали
    l = 0;
 
    //Значение текужего элемента
    c = 1;
 
    //Обрабатываем отдельные случаи: матрица-строка и матрица-столбец
    if (n == 1)
        for (int i = 0; i < m; i++)
            mtrx[0][i] = i + 1;
    else if (m == 1)
        for (int i = 0; i < n; i++)
            mtrx[i][0] = i + 1;
    else
        //Если матрица не является матрицей-строкой или матрицей-столбцом
        while (c <= m * n) 
        {
            //Верхняя часть витка спирали
            for (int i = l; (i < m - l) && (c <= m * n); i++)
                mtrx[l][i] = c++;
 
            //Правая часть
            for (int i = l + 1; (i < n - l) && (c <= m * n); i++)
                mtrx[i][m - l - 1] = c++;
 
            //Нижняя часть
            for (int i = m - l - 2; (i >= l) && (c <= m * n); i--)
                mtrx[n - l - 1][i] = c++;
 
            //Правая часть
            for (int i = n - l - 2; (i > l) && (c <= m * n); i--)
                mtrx[i][l] = c++;
 
            //Переходим на следующий виток
            l++;
        }
 
    //Выводим матрицу
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
            cout << setw(5) << mtrx[i][j];
 
        cout << endl;
    }
            
    system("PAUSE");
 
    return 0;
}
Yandex
Объявления
16.07.2011, 23:55     Заполнение матрицы спиралью
Ответ Создать тему
Опции темы

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