Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
итернал
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325
Завершенные тесты: 1
#1

Заполнение массива змейкой по диагонали - C++

28.08.2014, 22:57. Просмотров 1890. Ответов 10
Метки нет (Все метки)

народ можете немного помочь) надо заполнить массив таким способом
Название: массив.png
Просмотров: 174

Размер: 4.7 Кб
мне как бы не нужна прям целая программа мне хватит только одного условия) дальше я то уже справлюсь, мне просто не очень понятно как в цикле снова идет увелечение значений, ну к примеру если делать цикл из конца к началу, как например сначало заполнить к примеру (5,5) потом (4,5) и потом снова увеличить I и зделать (5,4) ну и тд, ну или же от начала к концу, но заполнять значениями на убывания, но всеравно что-то немогу придумать как бы оно так поворачивалось, подскажите пожалуйста
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2014, 22:57
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Заполнение массива змейкой по диагонали (C++):

Заполнение матрицы змейкой по диагонали
Дано натуральное N (1<=N<=10). Заполнить матрицу порядка NxN целыми числами 0,...

Заполнение матрицы по диагонали змейкой
будьте добры ,помогите написать програму: заполнение матрицы введенными с...

Заполнение массива змейкой
Заполнить массив змейкой; 1 3 4 10 11 21 2 5 9 12 20 22 6 8 13 19 23 30 7...

Заполнение двумерного массива змейкой
Добрый вечер, помогите пожалуйста, я написал код заполнения матрицы змейкой...

Заполнение массива "Змейкой"
Спасайте! нужно заполнить массив цифрами 49 48 44 43 35 34 22 47 45 42 36 33...

Заполнение массива по диагонали!
всем привет!помогите пожалуйста!не получается выстроить порядок! задача такая!...

10
S_el
2133 / 1661 / 354
Регистрация: 15.12.2013
Сообщений: 6,595
28.08.2014, 23:34 #2
итернал, подсказываю закономерность: влево,вверх-по-диагонали,вверх,вниз-по-диагонали.
0
КОП
446 / 353 / 115
Регистрация: 15.08.2010
Сообщений: 965
Завершенные тесты: 1
28.08.2014, 23:42 #3
S_el, только в верхней левой половине матрицы не прокатит
1
S_el
2133 / 1661 / 354
Регистрация: 15.12.2013
Сообщений: 6,595
28.08.2014, 23:48 #4
КОП, доходим до границы и движение не отрабатываем.
0
итернал
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325
Завершенные тесты: 1
29.08.2014, 00:06  [ТС] #5
Цитата Сообщение от S_el Посмотреть сообщение
итернал, подсказываю закономерность: влево,вверх-по-диагонали,вверх,вниз-по-диагонали.
ну что такая закономерность я вижу, я говорю что не совсем могу понять как это будет в цикле, оноже идет подрят, как вот зделать имено это вверх например после ячейки (4,5) заполнить вверх по диагонали (5,4) и что бы еще потом неполнило больше чем нужно
0
S_el
2133 / 1661 / 354
Регистрация: 15.12.2013
Сообщений: 6,595
29.08.2014, 00:08 #6
итернал, показывайте наработки,вместе исправим.
0
итернал
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325
Завершенные тесты: 1
29.08.2014, 00:19  [ТС] #7
ладно попытаюсь сам что нибуть придумать) спасибо за советы
0
КОП
446 / 353 / 115
Регистрация: 15.08.2010
Сообщений: 965
Завершенные тесты: 1
29.08.2014, 00:36 #8
итернал, универсальную версию будет сложнее реализовать, но если нужно именно 5х5 и только в указанном направлении, то можно в лоб:
задаем начальные координаты на посл элемент.
Делаем цикл, в котором двигаемся по диагонали в каком либо направлении.
Перед движением проверяем выход за пределы массива(и за какую границу), если да, то вместо движения обрабатываем сдвиг в нужном направлении.
Отдельно видимо придется обработать выход за нижний левый угол.

Попробуйте сами, выложите код, разберем.

PS: никогда не заполнял массивы, написал свою версию по указанному выше алгоритму, работает. спагетти те еще... Может гуру подскажут алгоритм попроще.

Добавлено через 1 минуту
и да, выход при достижении нулевых координат либо ограничить количество циклов до 25.

Добавлено через 3 минуты
Кстати, если нужен универсальный, можно заполнить массив в нормальном положении, а потом просто крутить и отражать.

Добавлено через 7 минут
Кстати, сначала пытался колдовать над универсальной формулой, выдающей значение исходя из координат и размера массива. Но понял, что дело долгое. Беглый поиск сразу выдал эту формулу. Но чисто для тренировки можно и поблудить по массиву, ибо формула только для такой змейки.
0
ZaMaZaN4iK
Мой лучший друг-отладчик!
164 / 164 / 30
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
29.08.2014, 00:43 #9
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
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <utility>
#include <queue>
#include <cmath>
 
using namespace std;
typedef long long ll;
 
 
ll n,m,i,j,k;
ll p[140][150];
 
void test()
{
    cin>>n;
    i=1;j=2;
    p[1][1]=1;
    for(ll q=2;q<n*n;)
    {
        for(;i<=n && j>=1;++i,--j,++q)  p[i][j]=q;
        if(i<=n && j<1) ++j;
        else    {--i;j+=2;}
        for(;i>=1 && j<=n;++j,--i,++q)  p[i][j]=q;
        if(j<=n)++i;
        else    {i+=2;--j;}
    }
    for(ll i=1;i<=n;++i)
    {
        for(ll j=1;j<=n;++j)
            cout<<p[i][j]<<' ';
        cout<<endl;
    }
}
 
 
int main()
{
    ios_base::sync_with_stdio(0);
    test();
    return 0;
}
0
итернал
4 / 4 / 6
Регистрация: 17.09.2012
Сообщений: 325
Завершенные тесты: 1
29.08.2014, 02:22  [ТС] #10
ZaMaZaN4iK, спасибо за код, на ночь уже не хочется розбератся уже утром посмотрю что да как, и у меня уже есть свои наработки, спасибо большое
КОП, спасибо за мысли, я тоже поискал в интернете на сколько я понял там получается нужно несколько циклов для заполнения двух половинок масива как бы, если что утром посмотрю код ЗамаЗанчика и если у меня будет какой-то другой ход решения тоже выложу, мало ли кому пригодится, я просто не разберал как у него
0
КОП
446 / 353 / 115
Регистрация: 15.08.2010
Сообщений: 965
Завершенные тесты: 1
29.08.2014, 02:35 #11
Цитата Сообщение от итернал Посмотреть сообщение
несколько циклов
вполне можно уложиться в один, надо лишь рулить координатами правильно, но главное - чтобы код был понятен. Лучше уж алгоритм похуже, но зато его можно быстро понять.

На всякий случай скину немного извращенный вариант, упомянутый выше.
C++
1
2
3
4
5
6
7
8
for (i = 0; i < m; ++i)
    {
        for (j = 0; j < m - i; ++j)
        {
            arr[i][j] = m*m + 1 - ((i + j + 1)*(i + j) / 2 + (i + j + 1) % 2 * (j + 1) + (i + j) % 2 * (i + 1));
            arr[m - i - 1][m - j - 1] = m*m + 1 - arr[i][j];
        }
    }
0
29.08.2014, 02:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2014, 02:35
Привет! Вот еще темы с решениями:

Заполнение массива 6х6 по диагонали
Заполнить массив 6х6 по диагонали (вложение) И вывести на экран. Я записал...

Заполнение двумерного массива (зануление диагонали)
Всем добрый вечер, прошу вашей помощи... дан массив 6х6, заполненный числами...

Заполнение змейкой
заполнение матрицы по диагонали змейкой по принципу 1 3 4 10 2 5 9 11 6 8 12...

Экзотическое заполнение массива параллельно побочной диагонали
Добрые люди,подскажите пожалуйста алгоритм для подобного стиля заполнения...


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

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

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