Заполнение матрицы челыми числами по спирали :)
Запись от ПерС размещена 29.04.2018 в 08:02
Показов 5149
Комментарии 5
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 5
Комментарии
-
Запись от Storm23 размещена 29.04.2018 в 20:28
-
Ну, если не быть слишком требовательным к временной сложности алгоритма, можно вот так обойти
Сообщение от Storm23
В принципе, такого кода много, мне кажется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 45 46 47 48 49 50 51
//Visual Studio 2015 #include <iostream> #include <cmath> #include <algorithm> using namespace std; void printItem (int a) { cout.width(3); cout << a << " "; } void spiral(int **arr, int X, int Y, int col_start, int row_start) { int x = col_start, y = row_start, dx = 1, dy = 0, step = 1; int filled = 0 , printable = X*Y; while (filled < printable) { for (int i =0 ; i < 2; i++) { for (int s = 0 ; s < step; s++) { if (x >= 0 && x < X && y >= 0 && y < Y) { //Здесь можно проверить, нет ли чего-то нужного в arr[y][x] printItem (arr[y][x]); filled++; } x += dx; y += dy; } int t = dx; dx = -dy; dy = t; } step++; } } int main() { const int rows = 8; const int cols = 4; int **a = new int *[rows]; int k = 1; for (int i = 0; i < rows; i++) { a[i] = new int[cols]; cout << endl; for (int j = 0; j<cols; j++) { a[i][j] = k++; printItem (a[i][j]); } } cout << endl; int row_start = 2; int col_start = 3; spiral(a, cols, rows, col_start, row_start); cin.get(); return 0; }
Запись от ПерС размещена 01.05.2018 в 13:58
-
Вот переписал на C# и в более удобоваримом виде:
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
static void Main() { var indexes = Spiral(5, 5).Take(15); foreach (var p in indexes) Console.WriteLine(p); } static IEnumerable<Point> Spiral(int xStart, int yStart) { int x = xStart, y = yStart, dx = 1, dy = 0, step = 1; while (true) { for (int i = 0; i < 2; i++) { for (int s = 0; s < step; s++) { yield return new Point(x, y); x += dx; y += dy; } int t = dx; dx = -dy; dy = t; } step++; } }
Может и много, но вот недавно нужен был такой обход по спирали, в инете быстро не нашел, а ломать себе голову было лень, пришлось реализовывать по-другому.
Теперь вот закину себе в библиотеку.Запись от Storm23 размещена 01.05.2018 в 19:18
-
Запись от Avazart размещена 05.05.2018 в 16:49
-
Так я же уже писал - для поиска соседей. Вот допустим у вас игра. Персонаж стоит в клетке с координатами (x,y), а вам нужно найти другого перса в соседней клетке (желательно ближайшего). Один из способов это сделать - вот такой вот поиск по спирали.
Сообщение от Avazart
По-вашему это проще?
Сообщение от Avazart

Запись от Storm23 размещена 05.05.2018 в 20:48



