Форум программистов, компьютерный форум, киберфорум
Комментарии
Войти
Регистрация
Восстановить пароль
  1. Старый комментарий
    Запись от ildwine размещена 05.05.2018 в 23:26 ildwine вне форума
  2. Старый комментарий
    Аватар для Storm23
    Заполнение матрицы челыми числами по спирали :)
    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    А для чего такое может понадобится?
    Так я же уже писал - для поиска соседей. Вот допустим у вас игра. Персонаж стоит в клетке с координатами (x,y), а вам нужно найти другого перса в соседней клетке (желательно ближайшего). Один из способов это сделать - вот такой вот поиск по спирали.

    Цитата:
    Сообщение от Avazart Просмотреть комментарий
    Наверное можно было бы проще создать массив bool как маску для проверки посещенности клетки, а направление рассматривать как шаг-вектор kx, kx и менять угол при упоре.
    По-вашему это проще?
    Запись от Storm23 размещена 05.05.2018 в 20:48 Storm23 вне форума
  3. Старый комментарий
    Аватар для Avazart
    Заполнение матрицы челыми числами по спирали :)
    А для чего такое может понадобится?

    Наверное можно было бы проще создать массив bool как маску для проверки посещенности клетки, а направление рассматривать как шаг-вектор kx, kx и менять угол при упоре.
    Запись от Avazart размещена 05.05.2018 в 16:49 Avazart вне форума
    Обновил(-а) Avazart 05.05.2018 в 16:52
  4. Старый комментарий
    Аватар для Storm23
    Заполнение матрицы челыми числами по спирали :)
    Вот переписал на 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 Storm23 вне форума
  5. Старый комментарий
    Аватар для ПерС
    Заполнение матрицы челыми числами по спирали :)
    Цитата:
    Сообщение от 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 ПерС вне форума
  6. Старый комментарий
    Аватар для Storm23
    Заполнение матрицы челыми числами по спирали :)
    А вот хорошо бы было видеть код заполнения из центра к краям для матрицы произвольного размера из произвольной начальной точки.
    Такая задача иногда встречается на практике - когда нужно в двумерном пространстве найти соседей по клеткам, постепенно увеличивая радиус обхода.
    Запись от Storm23 размещена 29.04.2018 в 20:28 Storm23 вне форума
  7. Старый комментарий
    Аватар для Evg
    count++%n
    Чтобы не переполнилось, нужно меньше выпендриваться и писать более аккуратно. Типа

    C
    array[count] = ...;
    count = (count + 1) %n;

    Вариант с остатком от деления, ко всему прочему, гарантированно работает быстрее в случаях, когда n является степенью двойки. И с большой вероятностью работает быстрее в случаях с произвольным n. Потому что не содержит операцию условного перехода, которая обычно сильно напрягает конвейер процессора. count нужно так же сделать беззнаковым (это сгенерирует более эффективный код)
    Запись от Evg размещена 09.12.2013 в 19:49 Evg вне форума
  8. Старый комментарий
    Аватар для programina
    count++%n
    C++
    array[count++%n]
    классная запись, нужно запомнить ее
    Запись от programina размещена 09.12.2013 в 19:42 programina вне форума
  9. Старый комментарий
    Аватар для kazak
    count++%n
    А что мешает использовать беззнаковый тип для count?
    Запись от kazak размещена 09.12.2013 в 11:58 kazak вне форума
  10. Старый комментарий
    Шифрование сдвигом полубайтов и инверсией
    [QUOTE=ПерС;bt7971]для меня лично куда более нечитаемы отступы в одну или две табуляции, из-за которых нужна горизонтальная прокрутка[/QUOTE]Если проект тянется хоты бы месяц, то там вполне ожидаемы не влезающие в экран имена переменных, так что горизонтальная прокрутка не может быть исключена в любом случае.
    Запись от размещена 05.12.2013 в 15:00
  11. Старый комментарий
    Шифрование сдвигом полубайтов и инверсией
    Полубайт можно двигать от одного до трёх раз, это три варианта. И инвертировать чётное, или не чётное количество раз. Если независимо от сдвигов, то получаем 3*2=6. Разделив сдвиги младшего и старшего полубайтов и инверсию, получаем (4*4-1)*2+1=31. Мало и долго. Надо двигать сразу на заданное ключом количество бит и результат подвергать исключающему или, это даст хотя бы 256*4*4-1=4095 вариантов. Если к этому добавить отдельный ключ для каждого байта сообщения, то шифр становится теоретически не вскрываемым с количеством вариантов каждого ключа 256*4*4=4096 при 256-ти вариантах самого байта.
    Запись от размещена 05.12.2013 в 14:58
  12. Старый комментарий
    Аватар для ПерС
    Шифрование сдвигом полубайтов и инверсией
    для меня лично куда более нечитаемы отступы в одну или две табуляции, из-за которых нужна горизонтальная прокрутка
    Запись от ПерС размещена 05.12.2013 в 14:01 ПерС вне форума
  13. Старый комментарий
    Аватар для ПерС
    Шифрование сдвигом полубайтов и инверсией
    это просто учебная задача
    при желании можно к каждой из функций добавить параметр "число шагов" и делать сдвиг столько раз, сколько записано в этом параметре
    Запись от ПерС размещена 05.12.2013 в 13:59 ПерС вне форума
  14. Старый комментарий
    Аватар для programina
    Шифрование сдвигом полубайтов и инверсией
    Намально! Но такое форматирование кода нечитаемо, или это тоже шифрование?
    Запись от programina размещена 03.12.2013 в 22:53 programina вне форума
  15. Старый комментарий
    Шифрование сдвигом полубайтов и инверсией
    Это вообще не шифр, так как предусматривает единственное преобразование. Шифр должен иметь ключ, здесь его нет, это просто альтернативная кодировка, не более. От если циклический сдвиг младшего полубайта на n бит, циклический сдвиг правого полубайта на m бит и потом ещё результат ксорится, тогда другое дело. А так это код, но не шифр. И для циклического сдвига не принципиально, выполняется ли он вправо, или влево, так как циклический сдвиг, например полубайта на 1 влево эквивалентен циклическому сдвигу того же полубайта на 3 вправо.
    Запись от размещена 03.12.2013 в 13:25
    Обновил(-а) taras atavin 03.12.2013 в 13:27
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru