Как я могу заполнить 2D-массив по спирали в C? Пример/проблема

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

Напишите программу, которая для заданных n и m формирует матрицу, как описано. Матрица должна быть m x m, и она заполняется «по спирали» своими начиная с левого верхнего угла. Первое значение в матрице равно число н. Это повторяется до «края» матрицы, на котором укажите число приращений. После числа 9 идет 0. 0 ≤ n ≤ 9, 0 ≤ м ≤ 9

Можете ли вы сначала решить, как это сделать на бумаге?

tadman 13.12.2020 10:05

Наивный подход: я бы начал со значений x=0, y=0, dx=1 и dy=0, используемых для навигации. Продолжайте заполнять n, пока не достигнете предела y, затем увеличивайте и «вращайте» свою пару dx/dy. Было бы полезно сначала заполнить эту вещь -1, чтобы вы могли обнаруживать ранее заполненные ячейки, а также края.

tadman 13.12.2020 10:07

Я попытался решить это, комментируя в CodeBlocks, и попытался найти закономерность в том, как номера строк/столбцов изменяют значения.

David Ilic 13.12.2020 10:07

Более разумный подход: проработайте его линейно, а затем «упакуйте» его в спираль при отображении. Существует шаблон, в котором места для отображения. В линейной последовательности вы видите: n-1 x (n), m-1 x (n+1) % 10 и т. д.

tadman 13.12.2020 10:08

Наивный подход был первой идеей, которая пришла мне в голову, именно так, буквально. Но я смущаюсь, когда пытаюсь реализовать это, лол

David Ilic 13.12.2020 10:10

пойду попробую более разумный подход

David Ilic 13.12.2020 10:10

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

tadman 13.12.2020 10:11
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
2
7
115
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Некоторое время назад я сделал функцию для отображения чисел от 1 до n на сетке нечетного размера. Принцип состоял в том, чтобы начать с центра и смещаться;

  • х = 1
  • х поле справа
  • х поле внизу
  • х++
  • х поле слева
  • х поле вверху
  • х++

С помощью этого простого алгоритма вы можете легко представить, что, возможно, вы начинаете с центра вашей проблемы и уменьшаете свою ценность, кажется, проще начать с центра.


Вот код, который иллюстрирует вышеприведенное решение, конечно, для адаптации к вашей проблеме, это только зацепка.

#define WE 5

void    clock(int grid[WE][WE])
{
    int count;
    int i;
    int reach;
    int flag;
    int tab[2] = {WE / 2, WE / 2}; //x , y

    count = 0;
    flag = 0;
    i = 0;
    reach = 1;
    grid[tab[1]][tab[0]] = count;
    for (int j = 0; j < WE - 1 && grid[0][WE - 1] != pow(WE, 2) - 1; j++)
        for (i = 0; i < reach && grid[0][WE - 1] != pow(WE, 2) - 1; i++, reach++)
        {
            if (flag % 2 == 0)
            {
                for(int right = 0 ; right < reach ; right++, tab[0]++, count++, flag = 1)
                    grid[tab[1]][tab[0]] = count;
                if (reach < WE - 1)
                    for(int bottom = 0; bottom < reach; bottom++, count++, tab[1]++)
                        grid[tab[1]][tab[0]] = count;
            }
            else
            {
                for(int left = 0; left < reach; left++, count++, tab[0]--, flag = 0)
                    grid[tab[1]][tab[0]] = count;
                for(int top = 0; top < reach; top++, tab[1]--, count++)
                    grid[tab[1]][tab[0]] = count;
            }
        }
}

Это хорошая идея, я обязательно попробую, так как у меня есть другая похожая проблема. Я уже решил это. Спасибо

David Ilic 13.12.2020 12:55

Я наконец решил это. Если кому интересно, вот как я это сделал:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

//Fills the row number "row" with the number n
int fillRow(int m, int n, int arr[m][m], int row)
{
    int j;

    for(j=0;j<m;j++)
    {
        if (arr[row][j] == -1 || arr[row][j] == n-1) arr[row][j] = n;
    }

}

//Fills the column number "col" with the number n
int fillCol(int m, int n, int arr[m][m], int col)
{
    int i;

    for(i=0;i<m;i++)
    {
        if (arr[i][col] == -1 || arr[i][col] == n-1) arr[i][col] = n;
    }

}

int main()
{

    int n, m, i, j, r=1, c=1, row=-1, col=-1;

    scanf("%d %d",&n, &m);

    int arr[m][m];
    
    
    //Fill array with -1 everywhere
    for(i=0;i<m;i++)
    {
        for(j=0;j<m;j++)
        {
            arr[i][j] = -1;
        }

    }
    
    //Calculate which row/column to fill (variables row/col)
    //Fill row then column then row than column...
    for(i=0;i<2*m;i++)
    {
        if (i%2==0)
        {
            row = (r%2==0) ? m-r/2 : r/2;
            fillRow(m, n, arr, row);
            n++;
            r++;
        }
        else if (i%2==1)
        {
            col = (c%2==0) ? c/2-1 : m-c/2-1;
            fillCol(m, n, arr, col);
            n++;
            c++;
        }
    }
    
    //If an element is larger than 9, decrease it by 10
    //Prints the elements
    for(i=0;i<m;i++)
    {
        for(j=0;j<m;j++)
        {
            if (arr[i][j]>9) arr[i][j] -=10;
            printf("%d ",arr[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Другие вопросы по теме