Уникальные перестановки без зеркальных или круговых повторений

Все вышеприведенные ответы предполагают, что земля является сферой. Однако, более точное приближение было бы приближением сплющенного сфероида.

a= 6378.137#equitorial radius in km
b= 6356.752#polar radius in km

def Distance(lat1, lons1, lat2, lons2):
    lat1=math.radians(lat1)
    lons1=math.radians(lons1)
    R1=(((((a**2)*math.cos(lat1))**2)+(((b**2)*math.sin(lat1))**2))/((a*math.cos(lat1))**2+(b*math.sin(lat1))**2))**0.5 #radius of earth at lat1
    x1=R*math.cos(lat1)*math.cos(lons1)
    y1=R*math.cos(lat1)*math.sin(lons1)
    z1=R*math.sin(lat1)

    lat2=math.radians(lat2)
    lons2=math.radians(lons2)
    R1=(((((a**2)*math.cos(lat2))**2)+(((b**2)*math.sin(lat2))**2))/((a*math.cos(lat2))**2+(b*math.sin(lat2))**2))**0.5 #radius of earth at lat2
    x2=R*math.cos(lat2)*math.cos(lons2)
    y2=R*math.cos(lat2)*math.sin(lons2)
    z2=R*math.sin(lat2)

    return ((x1-x2)**2+(y1-y2)**2+(z1-z2)**2)**0.5
7
задан caf 23 July 2009 в 07:04
поделиться

5 ответов

Отсюда только следует, что элементы с полосами прокрутки в других позициях чем у вершины будет scrollTop> 0.Если у вас есть элемент без полос прокрутки, можно было бы ожидать, что их позиция scrollTop IS 0, поскольку им некуда прокручивать.

Я не совсем уверен, в чем проблема.

РЕДАКТИРОВАТЬ: На всякий случай, что это не объяснено должным образом в документации jQuery:

scrollTop () => позиция полосы прокрутки для элемента (окно / div / что-либо прокручиваемое)

$ ("# element"). offset (). top => положение элемента относительно страницы

$ ("# element"). offset (). top - $ (window) .scrollTop () => положение элемента относительно области прокрутки.

scrollTop () => положение полосы прокрутки для элемента (окно / div / что-либо прокручиваемое)

$ ("# element"). Offset (). Top => положение элемента относительно page

$ ("# element"). offset (). top - $ (window) .scrollTop () => позиция элемента относительно области прокрутки.

scrollTop () => положение полосы прокрутки для элемента (окно / div / что-либо прокручиваемое)

$ ("# element"). Offset (). Top => положение элемента относительно page

$ ("# element"). offset (). top - $ (window) .scrollTop () => позиция элемента относительно области прокрутки.

Набор из всех браслетов позволяет варьировать количество A и B.

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

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

static int *a;
static int n;

void print_bracelet(int n, int a[])
{
    int i;

    printf("[");
    for (i = 0; i < n; i++)
        printf(" %c", 'a' + a[i]);
    printf(" ]\n");
}

int check_rev(int t, int i)
{
    int j;

    for (j = i+1; j <= (t + 1)/2; j++)
    {
        if (a[j] < a[t-j+1])
            return 0;
        if (a[j] > a[t-j+1])
            return -1;
    }

    return 1;
}

void gen_bracelets(int n_a, int n_b, int t, int p, int r, int u, int v, int rs)
{
    if (2 * (t - 1) > (n + r))
    {
        if (a[t-1] > a[n-t+2+r])
            rs = 0;
        else if (a[t-1] < a[n-t+2+r])
            rs = 1;
    }
    if (t > n)
    {
        if (!rs && (n % p) == 0)
            print_bracelet(n, a + 1);
    }
    else
    {
        int n_a2 = n_a;
        int n_b2 = n_b;

        a[t] = a[t-p];

        if (a[t] == 0)
            n_a2--;
        else
            n_b2--;

        if (a[t] == a[1])
            v++;
        else
            v = 0;

        if ((u == (t - 1)) && (a[t-1] == a[1]))
            u++;

        if ((n_a2 >= 0) && (n_b2 >= 0) && !((t == n) && (u != n) && (a[n] == a[1])))
        {
            if (u == v) {
                int rev = check_rev(t, u);

                if (rev == 0)
                    gen_bracelets(n_a2, n_b2, t + 1, p, r, u, v, rs);

                if (rev == 1)
                    gen_bracelets(n_a2, n_b2, t + 1, p, t, u, v, 0);
            }
            else
                gen_bracelets(n_a2, n_b2, t + 1, p, r, u, v, rs);
        }

        if (u == t)
            u--;

        if (a[t-p] == 0 && n_b > 0)
        {
            a[t] = 1;

            if (t == 1)
                gen_bracelets(n_a, n_b - 1, t + 1, t, 1, 1, 1, rs);
            else
                gen_bracelets(n_a, n_b - 1, t + 1, t, r, u, 0, rs);
        }
    }
}

int main(int argc, char *argv[])
{
    int n_a, n_b;

    if (argc < 3)
    {
        fprintf(stderr, "Usage: %s <a> <b>\n", argv[0]);
        return -2;
    }

    n_a = atoi(argv[1]);
    n_b = atoi(argv[2]);

    if (n_a < 0 || n_b < 0)
    {
        fprintf(stderr, "a and b must be nonnegative\n");
        return -3;
    }

    n = n_a + n_b;
    a = malloc((n + 1) * sizeof(int));

    if (!a)
    {
        fprintf(stderr, "could not allocate array\n");
        return -1;
    }

    a[0] = 0;

    gen_bracelets(n_a, n_b, 1, 1, 0, 0, 0, 0);

    free(a);
    return 0;
}
2
ответ дан 7 December 2019 в 16:44
поделиться

Если у вас всего два элемента, ваше пространство намного меньше: 2 ^ k, а не k!.

Попробуйте такой подход:

  1. Переберите все числа от 1 до 2 ^ k.
  2. Запишите число в двоичной форме.
  3. Преобразуйте все нули в a и единицы в b. Теперь у вас есть перестановка.
  4. Возьмите вашу последовательность и сгенерируйте 2k последовательностей циклическими перестановками и обращениями. Вам нужно оценить только 1 из этих 2k последовательностей.
  5. Среди 2k последовательностей выберите ту, которая сортируется первой в алфавитном порядке.
  6. Проверьте свой журнал, чтобы узнать, выполнили ли вы это уже. Если да, пропустите.
  7. Если это новый, оцените его и добавьте в журнал «Готово». (Если позволяет место, вы можете добавить все 2k элементов «семейства» в журнал выполненных работ, чтобы вы могли переместить шаг (6) сразу после шага (3). Вы также можете сохранить номер,
0
ответ дан 7 December 2019 в 16:44
поделиться

Вы ищете комбинации, которые не зависят от порядка. Matlab правильно рассчитал это с помощью K! / N! M! что и есть формула для расчета количества комбинаций.

0
ответ дан 7 December 2019 в 16:44
поделиться

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

for each (element in array of permutations){
  if (element exists in hash){
    remove each circular permutation of element in hash except for element itself
  }
}
0
ответ дан 7 December 2019 в 16:44
поделиться

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

1
ответ дан 7 December 2019 в 16:44
поделиться
Другие вопросы по тегам:

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