Глобальная переменная работает не так, как ожидалось - PullRequest
1 голос
/ 22 сентября 2019

1

Это проблема, которую я пытаюсь решить.(При заданной строке длиной 2n различных символов я должен разделить ее на 2 части всеми возможными способами без повторяющихся групп).

Я использовал следующий метод:

  1. Генерация всех перестановокof string.
  2. Сохранение допустимых перестановок (я генерирую "hauy" и "hayu" обе, но сохраняю только одну из них).
  3. Проверка вновь созданных перестановок по отношению к сохраненным, чтобы отфильтровать дубликаты.
  4. Печать

(я понимаю, что могли бы быть более эффективные способы сделать это)

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

char *b[100000000];
int bSize = 0;
void print(char *a)
{   
    int k = strlen(a);
    printf("M: ");
    for(int i=0 ; i<k/2 ; i++)
    {
        printf("%c ", a[i]);
    }
    printf("| B: ");
    for(int i=0 ; i<k/2 ; i++)
    {
        printf("%c ", a[k/2 + i]);
    }
    printf("\n");
}
void check(char *a)
{
    int k = strlen(a);
    for(int i=0 ; i<bSize ; i++)
    {
        int c = 0;
        for(int j=0 ; j<k/2 ; j++)
        {
            for(int m=0 ; m<k/2 ; m++)
            {
                if(a[m] == b[i][j])
                {
                    c++;
                    break;
                }
            }
        }
        for(int j=0 ; j<k/2 ; j++)
        {
            for(int m=0 ; m<k/2 ; m++)
            {
                if(a[m + k/2] == b[i][j + k/2])
                {
                    c++;
                    break;
                }
            }
        }
        if(c == k)
        {   
            break;
        }
        else
        {
            b[bSize] = a;
            bSize++;
            print(a);
        }
    }
}
void swap(char *a, char *b)
{
    char temp = *a;
    *a = *b;
    *b = temp;
}
void permute(char *a, int start, int end)
{
    if(start == end)
        if(bSize == 0)
        {
            print(a);
            b[bSize] = a;
            bSize++;
        }
        else
            check(a);
    else
    {
        for(int i=start ; i<=end ; i++)
        {
            swap((a+start), (a+i));
            permute(a, start+1, end);
            swap((a+start), (a+i));
        }
    }
}
int main()
{
    int n;
    scanf("%d", &n);
    char f;
    scanf("%c", &f);
    char A[n];
    for(int i=0 ; i<n-2 ; i++)
    {
        char c;
        scanf("%c", &c);
        if(c == ' ' || c == 'M' || c == 'B')
            i--;
        else
            A[i] = c;
    }
    A[n-2] = '\0';
    permute(A, 0, n-3);
    return 0;
}

Когда я запускаю эту, только 1 строка дается в качестве вывода.Я думаю, что ошибка с b[].В функции check b[0] и a всегда оказываются равными.И bSize никогда не выходит за пределы 1. Я не могу понять, почему.

1 Ответ

0 голосов
/ 22 сентября 2019

b[bSize] = a; сохраняет значение a в b[bSize].a - указатель на первый элемент массива A, определенный в main.Таким образом, вы не храните отдельные строки, просто указатель на A, и этот указатель никогда не меняется.

Чтобы использовать этот алгоритм, вы должны скопировать каждую строку.Это требует изменений в том, как определяется b и как сравниваются строки.(Вы не можете сравнивать строки с ==.)

(Однако существует гораздо лучший алгоритм для этой задачи, который не требует генерации всех перестановок.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...