Преобразование 1D в 2D УПОРЯДОЧЕННУЮ спираль, начиная с центра

#c #visual-c

#c #visual-c

Вопрос:

извините за беспокойство, но я застрял в этом, идея такова:

Вставьте в консоль числа от 1 до 9 (не имеет значения порядок или повторяется ли он) и создайте 2-мерный массив, НО он должен быть упорядочен в ОБРАТНОМ ПОРЯДКЕ по СПИРАЛИ (начиная с центра)

ПРИМЕР 1:

ВВОД (ввод чисел без пробелов):

 123456789
 

ВЫВОД:

 789
612
543
 

ПРИМЕР 2:

ВВОД (ввод чисел без пробелов):

 12345678976
 

ВЫВОД:

 7897
6126
543
 

Я СДЕЛАЛ ЭТО:
для получения чисел и попытки ввести вектор из 2 измерений, но после этого момента я не знаю, как мне сделать спираль…

прикрепил мой код:

 #include <iostream>

using namespace std;

int main()
{
    int a[] = { 1,2,3,4,5,6,7,8,9 };
    int b[3][3];
    int k = 0;
    int i, j;
    int arrSize = sizeof(a) / sizeof(a[0]);
    cout << arrSize;
    cout << endl;

    for (i = 0; i < 3; i  )
    for (j = 0; j < 3; j  )
    b[i][j] = a[k  ];

    for (i = 0; i < 3; i  )
    {
        for (j = 0; j < 3; j  )
            cout << b[i][j];
        cout << endl;
        
    }
}
 

С помощью этого кода я смогу поместить в 2D-массив.

Заранее благодарю вас за ваше время и терпение со мной!

Комментарии:

1. Добро пожаловать в Stack Overflow. Это не сервис для написания кода или решения задач; вы должны выполнить хотя бы часть работы самостоятельно. Вы можете писать простые программы? Можете ли вы решить эту головоломку с помощью карандаша и бумаги?

2. Попробуйте сначала определить, каковы индексы элемента «center». Я думаю, так и должно быть [M/2][N/2] . Затем вы увеличиваете «виртуальный индекс» на 1 каждые две итерации вместе с его знаком: 1, 1, -2, -2, 3, 3, и т.д. и в то же время изменяя направление перемещения, что было бы просто переключением управляемого измерения на каждой итерации.

Ответ №1:

Следующая программа перечисляет последовательность (x, y) для спирали. Первый список с использованием начальных точек, расположенных в (0, 0). Второй перемещает начало спирали в положение (minimum.x, minimum.y). Минимум сохраняет координату левого нижнего элемента.

В программе можно соблюдать правило спирали. Позиция (x, y) сначала начинается с (n, n-1), где n — это n-й цикл спирали. Сначала переместите позицию вниз, —y, пока y не достигнет -n; затем переместите x влево, пока x = -n; затем переместите y вверх, пока y = n; наконец, переместите x вправо, пока x = n . В следующей программе max (n) set = 4 имеется 4 спиральных цикла. Вы можете настроить этот параметр n в соответствии с вашими целями.

Общее количество каждого цикла спирали = 8 * n, за исключением самого внутреннего цикла (0,0), число = 1. Следовательно, количество элементов спирали = 1 8*1 8*2 8*3 …. Сначала вам нужно определить циклы спирали по длине входной строки L, число циклов равно `n = ( (L-1) / 8 1 );` или `n = ( (L-1) / 8);` если ремайдера не осталось.

 #include <iostream>
#include <vector>
struct int2 {
   int x, y;
   int2():x(0), y(0) {}
   int2(const int a, const int b):x(a), y(b) {}
   int2amp; operator=(const int2amp;) = default;
   void print() const {std::cout << "( " << x <<", " << y << ") "; }
   int2amp; operator =(const int2amp;a) { this->x  = a.x ; this->y  = a.y; return *this;}
   int2amp; operator-() {x = -x; y = -y; return *this;}
};
int main()
{
    std::vector<int2> spiral;
    int2 pos, minimum;
    int n;
    pos = int2(0,0);
    minimum = pos;
    spiral.push_back(pos);
    for (n=1; n<5; n  )
    {
        pos = int2( n, n-1); // starting point for ith loop
        spiral.push_back(pos);
        while (pos.y > -n) {--pos.y; spiral.push_back(pos); if (pos.y < minimum.y) minimum.y = pos.y;}
        while (pos.x > -n) {--pos.x; spiral.push_back(pos); if (pos.x < minimum.x) minimum.x = pos.x; }
        while (pos.y <  n) {  pos.y; spiral.push_back(pos); }
        while (pos.x <  n) {  pos.x; spiral.push_back(pos); }
    }
    -minimum;
    std::cout << "center at (0, 0)n";
    for (int i=0; i<spiral.size(); i  ) spiral[i].print();
    std::cout<<std::endl;
    for (int i=0; i<spiral.size(); i  ) spiral[i]  = minimum;
    std::cout << "center at "; minimum.print(); std::cout<<std::endl;
    for (int i=0; i<spiral.size(); i  ) spiral[i].print();
    std::cout<<std::endl;
    return 0;
}
 

Эти позиции выше (x, y) предоставляют вам массив 2-d последовательности [x] [y] для записи символа, образующего спиральную структуру.

 center at (0, 0)
( 0, 0) ( 1, 0) ( 1, -1) ( 0, -1) ( -1, -1) ( -1, 0) ( -1, 1) ( 0, 1) ( 1, 1) ( 2, 1) ( 2, 0) ( 2, -1) ( 2, -2) ( 1, -2) ( 0, -2) ( -1, -2) ( -2, -2) ( -2, -1) ( -2, 0) ( -2, 1) ( -2, 2) ( -1, 2) ( 0, 2) ( 1, 2) ( 2, 2) ( 3, 2) ( 3, 1) ( 3, 0) ( 3, -1) ( 3, -2) ( 3, -3) ( 2, -3) ( 1, -3) ( 0, -3) ( -1, -3) ( -2, -3) ( -3, -3) ( -3, -2) ( -3, -1) ( -3, 0) ( -3, 1) ( -3, 2) ( -3, 3) ( -2, 3) ( -1, 3) ( 0, 3) ( 1, 3) ( 2, 3) ( 3, 3) ( 4, 3) ( 4, 2) ( 4, 1) ( 4, 0) ( 4, -1) ( 4, -2) ( 4, -3) ( 4, -4) ( 3, -4) ( 2, -4) ( 1, -4) ( 0, -4) ( -1, -4) ( -2, -4) ( -3, -4) ( -4, -4) ( -4, -3) ( -4, -2) ( -4, -1) ( -4, 0) ( -4, 1) ( -4, 2) ( -4, 3) ( -4, 4) ( -3, 4) ( -2, 4) ( -1, 4) ( 0, 4) ( 1, 4) ( 2, 4) ( 3, 4) ( 4, 4)


center at ( 4, 4)
( 4, 4) ( 5, 4) ( 5, 3) ( 4, 3) ( 3, 3) ( 3, 4) ( 3, 5) ( 4, 5) ( 5, 5) ( 6, 5) ( 6, 4) ( 6, 3) ( 6, 2) ( 5, 2) ( 4, 2) ( 3, 2) ( 2, 2) ( 2, 3) ( 2, 4) ( 2, 5) ( 2, 6) ( 3, 6) ( 4, 6) ( 5, 6) ( 6, 6) ( 7, 6) ( 7, 5) ( 7, 4) ( 7, 3) ( 7, 2) ( 7, 1) ( 6, 1) ( 5, 1) ( 4, 1) ( 3, 1) ( 2, 1) ( 1, 1) ( 1, 2) ( 1, 3) ( 1, 4) ( 1, 5) ( 1, 6) ( 1, 7) ( 2, 7) ( 3, 7) ( 4, 7) ( 5, 7) ( 6, 7) ( 7, 7) ( 8, 7) ( 8, 6) ( 8, 5) ( 8, 4) ( 8, 3) ( 8, 2) ( 8, 1) ( 8, 0) ( 7, 0) ( 6, 0) ( 5, 0) ( 4, 0) ( 3, 0) ( 2, 0) ( 1, 0) ( 0, 0) ( 0, 1) ( 0, 2) ( 0, 3) ( 0, 4) ( 0, 5) ( 0, 6) ( 0, 7) ( 0, 8) ( 1, 8) ( 2, 8) ( 3, 8) ( 4, 8) ( 5, 8) ( 6, 8) ( 7, 8) ( 8, 8)