![1](https://i.stack.imgur.com/uw5qV.png)
Это проблема, которую я пытаюсь решить.(При заданной строке длиной 2n различных символов я должен разделить ее на 2 части всеми возможными способами без повторяющихся групп).
Я использовал следующий метод:
- Генерация всех перестановокof string.
- Сохранение допустимых перестановок (я генерирую "hauy" и "hayu" обе, но сохраняю только одну из них).
- Проверка вновь созданных перестановок по отношению к сохраненным, чтобы отфильтровать дубликаты.
- Печать
(я понимаю, что могли бы быть более эффективные способы сделать это)
#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. Я не могу понять, почему.