так что я боролся с этим примером уже хороший час, и я даже не могу начать обрабатывать, как мне это сделать.
Напишите программу, которая для заданных n и m формирует матрицу, как описано. Матрица должна быть m x m, и она заполняется «по спирали» своими начиная с левого верхнего угла. Первое значение в матрице равно число н. Это повторяется до «края» матрицы, на котором укажите число приращений. После числа 9 идет 0. 0 ≤ n ≤ 9, 0 ≤ м ≤ 9
Наивный подход: я бы начал со значений x=0
, y=0
, dx=1
и dy=0
, используемых для навигации. Продолжайте заполнять n
, пока не достигнете предела y
, затем увеличивайте и «вращайте» свою пару dx
/dy
. Было бы полезно сначала заполнить эту вещь -1
, чтобы вы могли обнаруживать ранее заполненные ячейки, а также края.
Я попытался решить это, комментируя в CodeBlocks, и попытался найти закономерность в том, как номера строк/столбцов изменяют значения.
Более разумный подход: проработайте его линейно, а затем «упакуйте» его в спираль при отображении. Существует шаблон, в котором места для отображения. В линейной последовательности вы видите: n-1
x (n)
, m-1
x (n+1) % 10
и т. д.
Наивный подход был первой идеей, которая пришла мне в голову, именно так, буквально. Но я смущаюсь, когда пытаюсь реализовать это, лол
пойду попробую более разумный подход
Это одна из тех вещей, которые помогают сначала поработать на бумаге, чтобы найти закономерности.
Некоторое время назад я сделал функцию для отображения чисел от 1 до n на сетке нечетного размера. Принцип состоял в том, чтобы начать с центра и смещаться;
С помощью этого простого алгоритма вы можете легко представить, что, возможно, вы начинаете с центра вашей проблемы и уменьшаете свою ценность, кажется, проще начать с центра.
Вот код, который иллюстрирует вышеприведенное решение, конечно, для адаптации к вашей проблеме, это только зацепка.
#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;
}
}
}
Это хорошая идея, я обязательно попробую, так как у меня есть другая похожая проблема. Я уже решил это. Спасибо
Я наконец решил это. Если кому интересно, вот как я это сделал:
#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;
}
Можете ли вы сначала решить, как это сделать на бумаге?