c - 全局变量行为异常-LMLPHP
这就是我要解决的问题。(给定一个2n长度的不同字符字符串,我必须以所有可能的方式将其分成两部分,而不必重复分组)。
我使用的方法是:
生成字符串的所有置换。
存储可接受的排列(我正在生成“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;
}

当我运行这个时,只有一行作为输出。我认为错误在于b[]。在check函数中b[0]a总是相等的。并且bSize永远不会超过1。我不明白为什么。

最佳答案

b[bSize] = a;a的值存储在b[bSize]中。a是指向A中定义的数组的第一个元素的指针。因此,您不存储单个字符串,只存储指向main的指针,而且该指针永远不会更改。
要使用此算法,必须复制每个字符串。这需要更改如何定义A以及如何比较字符串。(不能将字符串与b进行比较)
(但是,对于这个任务,有一个更好的算法,它不需要生成所有的排列。)

07-24 14:01