0 / 0 / 0
Регистрация: 05.05.2015
Сообщений: 25
1

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

07.05.2015, 12:28. Показов 5337. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Нужна ваша помощь. Прошу, код должен быть предельно простым.


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

Заранее благодарю!

Добавлено через 21 час 19 минут
Хоть кто-нибудь. Хоть какую-нибудь идею....

Добавлено через 18 часов 2 минуты
1 8 7

2 9 6

3 4 5
Вот пример результата.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.05.2015, 12:28
Ответы с готовыми решениями:

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

Заполнить массив последовательными натуральными числами, идущими по спирали
привет всем не могу написать программу, помогите пожалуйста можно просто алгоритм с...

Заполнить двумерный массив последовательными убывающими числами
Помогите пожалуйста...очень прошу** Дан массив А размером n x m. Заполнить его следующим образом:...

Заполнить массив произвольного размера неповторяющимися числами
Ребята, подскажите, как при помощи randomize заполнить массив произвольного размера...

7
553 / 361 / 206
Регистрация: 27.11.2014
Сообщений: 1,049
07.05.2015, 12:40 2
бамс
1
63 / 69 / 22
Регистрация: 28.04.2015
Сообщений: 194
Записей в блоге: 1
07.05.2015, 12:56 3
Если еще не сделали, то по примеру ture
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
using System;
 
 
public class Example
{
    public static void Main()
    {
        int N = 3, M = 3;
        int[,] A = new int[N, M];
 
 
        //Заносим значения в массив
        
        int row = 0, col = 0, dx = 1, dy = 0, dirChanges = 0, gran = M;
        
        for (int i = 0; i < A.Length; i++)
        {
            A[col, row] = i + 1;
            if (--gran == 0)
            {
                gran = M * (dirChanges % 2) + N * ((dirChanges + 1) % 2) - (dirChanges / 2 - 1) - 2;
                int temp = dx;
                dx = -dy;
                dy = temp;
                dirChanges++;
            }
            col += dx;
            row += dy;
        }               
 
        //Выводим на консоль
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < M; j++)
            {
                Console.Write(A[i, j] + " ");
            }
            Console.WriteLine();
        }
 
 
        Console.ReadKey();
    }
}
0
0 / 0 / 0
Регистрация: 05.05.2015
Сообщений: 25
07.05.2015, 23:06  [ТС] 4
Спасибо, но массив должен быть произвольным. (введён с клавиатуры)

Добавлено через 4 минуты
Я не силён во всём этом деле. Не могли бы вы переделать под мой вариант.

Добавлено через 7 минут
Не важно. Разобрался. Спасибо огромное!!!
Для тех, кому интересно:
"int N = 3, M = 3;" изменил на int N, M; и после добавил
N = Convert.ToInt32(Console.ReadLine());
M = Convert.ToInt32(Console.ReadLine());


Добавлено через 7 часов 54 минуты
Переделал так, чтобы можно было вводить размер массива вручную. Программа не работает, если ввести разные цифры. Например 2 и 3; 3 и 2; 4 и 5; и т.д.
0
553 / 361 / 206
Регистрация: 27.11.2014
Сообщений: 1,049
08.05.2015, 11:12 5
Лучший ответ Сообщение было отмечено Dendero как решение

Решение

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
using System;
 
 
 
namespace cyber1 {
    class Program {
        static void Main() {
            Console.Write(" n = ");
            int N = int.Parse(Console.ReadLine());//границы снизу и сверху
            Console.Write(" m = ");
            int M = int.Parse(Console.ReadLine());//границы слева и спава
           
 
            int[,] MM = new int[N, M];            
            int row = 0, col = 0, dx = 0, dy = 1, dirChanges = 0, gran = N;
            int l =  MM.Length;
            for(int i = 0; i < l; i++) {
                MM[row, col] = i + 1;
 
                if(--gran == 0) {
                    gran = N * (dirChanges % 2) + M * ((dirChanges + 1) % 2) - (dirChanges / 2 - 1) - 2;
                    int temp = dy;
                    dy = -dx;
                    dx = temp;
                    dirChanges++;
                }
 
                col += dx;
                row += dy;
            }
                        
            M = MM.GetLength(1);
            for(int k = 0; k < l; k++)
                Console.Write("{0}{1,3}", k % M == 0 ? "\n" : "", MM[k / M, k % M]);
 
 
            Console.ReadLine();
        }
    }
}
1
0 / 0 / 0
Регистрация: 05.05.2015
Сообщений: 25
08.05.2015, 15:29  [ТС] 6
Cпасибо огромное!

Добавлено через 43 минуты
M = MM.GetLength(1);
for(int k = 0; k < l; k++)
Console.Write("{0}{1,3}", k % M == 0 ? "\n" : "", MM[k / M, k % M]);

Объясните вот эту часть пожалуйста.
0
553 / 361 / 206
Регистрация: 27.11.2014
Сообщений: 1,049
08.05.2015, 15:55 7
Dendero, это я так понтанулся. Печатать массив можно любым удобным способом
0
0 / 0 / 0
Регистрация: 05.05.2015
Сообщений: 25
10.05.2015, 12:38  [ТС] 8
Я такого ещё не изучал, поэтому не понимаю. Не переделаешь в более упрощённый вариант, пусть даже и команд будет больше.

Добавлено через 36 минут
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
int a, b;
            a = Convert.ToInt32(Console.ReadLine());
            b = Convert.ToInt32(Console.ReadLine());
 
            int[,] m = new int[a, b];
            int i, riad = 0, stolb = 0, x = 0, y = 1, d = 0, g = a, t = 0;
            
            for (i = 0; i < a*b; i++)
            {
                m[riad, stolb] = i;
                g = g - 1;
                if (g == 0)
                {
                    g = a * (d % 2) + b * ((d + 1) % 2) - (d / 2 - 1) - 2;
                    t = y;
                    y = x-(x+x);
                    x = t;
                    d = d + 1;
                }
 
                stolb = stolb + x;
                riad = riad + y;
            }
 
            
            b = m.GetLength(1);
            for (int k = 0; k < a*b; k++)
               Console.Write("{0}{1,3}", k % b == 0 ? "\n" : "", m[k / b, k % b]);
Я переделал задачу под себя, чтобы более-менее было понятно. Только я с условием до сих пор не могу разобраться. Если не сложно, можешь объяснить что и как. Пожааалуйста!
0
10.05.2015, 12:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.05.2015, 12:38
Помогаю со студенческими работами здесь

Заполнить двумерный массив целыми числами от 1 до 100 по спирали
Заполнить двумерный массив целыми числами от 1 до 100 по спирали

Заполнить двумерный массив целыми числами от 1 до 100 по спирали
Заполнить двумерный массив целыми числами от 1 до 100 по спирали Начал изучение c++. Работаю в...

Заполнить двумерный квадратный массив целыми числами от 1 до 100 по спирали,
Заполнить двумерный квадратный массив целыми числами от 1 до 100 по спирали, с правого крайнего...

Заполнить двумерный массив размером 7 на 7 числами, расположенными в нем по спирали
Заполнить двумерный массив размером 7 на 7 числами 1,2,..49, расположенными в нем по спирали!...


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

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

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