@AndreyRafalsky13

Как реализовать заполнение матрицы спиралью через вложенный цикл?

Нужно реализовать заполнение матрицы числами по спирали

1 2 3 4

12 13 14 5

11 16 15 6

10 9 8 7

Придумал, как реализовать заполнение через 4 цикла. Но возник вопрос, как можно упростить решение. Возможно ли реализовать заполнение через два цикла, один из которых вложенный? То есть, чтобы просто итерироваться по строкам и столбцам. Для такого решения нужно найти закономерность между числовым значением и индексами, где это значение должно располагаться. Но закономерность никак не могу найти, хотя говорили, что она определенно существует. Помогите разобраться, можно ли реализовать заполнение подобным образом.
  • Вопрос задан
  • 2754 просмотра
Решения вопроса 2
Stalker_RED
@Stalker_RED
Можно и с одним циклом:

Работает с любыми прямоугольными матрицами.
Ответ написан
Комментировать
0xD34F
@0xD34F
Десять секунд гугления, находим примерный вариант - надо только порядок поменять, от краёв к центру:

#include <iostream>
#include <iomanip>
#include <bits/stdc++.h> 

using namespace std;

int main()
{
  const int N = 6;

  int m[N][N] = { 0 };

  for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
      int x = min(min(i, j), min(N - 1 - i, N - 1 - j));
      m[i][j] = N * N + 1 - (i > j
        ? (N - 2 * x - 2) * (N - 2 * x - 2) + (i - x) + (j - x)
        : (N - 2 * x) * (N - 2 * x) - (i - x) - (j - x)
      );
    }
  }

  for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
      cout << setw(5) << m[i][j];
    }
    cout << endl;
  }
   
  return 0;
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Вспомнил, как в десятом классе решал эту же задачу. Только на Паскале и сам. Чудом сохранился код, который вам и покажу, хотя после предыдущих ответов он не несёт никакой ценности.

type tabelo = array[byte,byte] of integer;
procedure filling_spiral(var Q:tabelo; a,b:integer);
  var c,d,e,f,g,h:integer;
  begin
    c:=a-1;
    d:=b-1;
    e:=1;
    if a>=b then f:=b else f:=a;
    for g:=0 to (f div 2) do
      begin
        for h:=b-d+g to d-g do
          begin
            if Q[a-c+g,h]=0 then Q[a-c+g,h]:=e else break;
            inc(e)
          end;
        for h:=a-c+g to c-g do
          begin
            if Q[h,b-g]=0 then Q[h,b-g]:=e else break;
            inc(e)
          end;
        for h:=b-g downto b-d+g+1 do
          begin
            if Q[a-g,h]=0 then Q[a-g,h]:=e else break;
            inc(e)
          end;
        for h:=a-g downto a-c+g do
          begin
            if Q[h,b-d+g]=0 then Q[h,b-d+g]:=e else break;
            inc(e)
          end
      end
  end;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы