在某些情况下,PCP求解器数据输入无法正常工作

时间:2015-01-16 16:14:19

标签: c string unix input

所以我编写了一个程序,其目的是解决PCP问题,它适用于大多数问题,例如维基百科上发现的问题,但是当我从Hopcroft& amp; Ullman的书中显示了分段错误(当自动解决时),当我选择手动选项时,它使用与我输入的完全不同的数据使问题无法解决(我认为这就是为什么它在自动解决时崩溃的原因)

快速介绍计划的运作方式:

  1. 用户输入每个列表中的数字数
  2. 用户将元素输入到每个列表A和B

  3. 用户选择手动解决或让程序找到其中一个解决方案。

  4. 4M。用户在每个输入程序打印每个单词A和B

    后输入试图找到解决方案的列表中的元素数

    4A。程序正在寻找数字的排列并检查它们之间是否存在解决方案如果找到解决方案,则将其打印在屏幕上,同时显示单词A和B

    我的程序无法正常工作时的PCP

    _ _ 1 _ 2 _ _ 3 _当我为这个问题选择手动解决方案时

    A 1 _ 10111 _ 10告诉我A2这个词是111,这是错误的:..(

    B 101 _ 11 _ 011

    当然我的代码是使用Unix终端内置的编译器(" cc"命令)

    #include <stdio.h>
    #include <stdio.h>
    #include <string.h>
    
    #define LISTSIZE 32
    #define CHAINSIZE 256
    
    char listA[LISTSIZE][CHAINSIZE]={0}, listB[LISTSIZE][CHAINSIZE]={0};
    //lists A and B
    void permute(int a[], int i, int n)
    {
    int j, c, tmp, counter = 1;
    if (i == n)
    {
        for(j = 0; j <= n; j++)
        {
            strcat(listA[LISTSIZE - 1], listA[a[j] -1]);
            strcat(listB[LISTSIZE - 1], listB[a[j] -1]);
            if( strcmp(listA[LISTSIZE - 1], listB[LISTSIZE - 1]) == 0)
            {
                printf("\n\n\t Rozwiązanie zostało znalezione automatycznie!\n");//solution was found
                printf("\nOdpowiedź\t\t");//solution
                for(j = 0; j<= counter - 1; j++)
                    printf("%d", a[j]);
                printf("\n\tA: %s", listA[LISTSIZE - 1]);//word A
                printf("\n\tA: %s", listB[LISTSIZE - 1]);//word B should be the same
                printf("\n\n");
                exit(0);
            }
            counter++;
        }
        for(c = 0; c < CHAINSIZE; c++)
        {
            listA[LISTSIZE - 1][c] = 0;
            listA[LISTSIZE - 1][c] = 0;
        }
    }
    else
    {
        for(j = i; j <= n; j++)
        {
            tmp = a[i];
            a[i] = a[j];
            a[j] = tmp;
            permute(a, i + 1, n);
            tmp = a[i];
            a[i] = a[j];
            a[j] = tmp;
        }
    }
    }
    
    int main()
    {
    int odpowiedz[CHAINSIZE], i, j, n, decyzja, a[CHAINSIZE], as;
    printf("\n\nPo ile elementów ma zawierać każda z list? ");//how much elements for each list
    scanf("%d", &i);
    as = i;
    for(j = 0; j < i; j++)//first permutation solution can be max lenght of 3 times as the number of elements
    {
        a[j] = j + 1;
        a[j + i] = j + 1;
        a[j + i + i] = j + 1;
    }
    for(j = 0; j < i; j++)
    {//enter the words to list A
        printf("Podaj łańcuch nr %d do listy A: ", j + 1);
        scanf("%s", listA[j]);
    }
    for(j = 0; j < i; j++)
    {//enter words to list B
        printf("Podaj łańcuch nr %d do listy B: ", j + 1);
        scanf("%s", listB[j]);
    }//Do you want to find solution manually or automatically?
    printf("Czy chesz szukać rozwiązania ręcznie czy automatycznie? ");
    printf("\nWypisz 1 lub 0? ( 1 = tryb automatyczny\t0 = tryb manualny) ");
    scanf("%d", &decyzja);// 1 = auto   0 = manual
    if(0 == decyzja)
    {
        printf("\n\tNastąpi manualne poszukiwanie rozwiązania, aby zakończyć wpisz 0"); //manual mode was choosen enter 0 to exit
        for(n = 0; ; n++)
        {
            printf("\n\tWpisz numer: ");//enter nuber of word from list A and B
            scanf("%d", &i);
            if(i == 0)
                break;
            odpowiedz[n] = i;
            strcat(listA[LISTSIZE - 1], listA[a[j] -1]);
            strcat(listB[LISTSIZE - 1], listB[a[j] -1]);
            printf("\n\tA: %s", listA[LISTSIZE - 1]);
            printf("\n\tA: %s", listB[LISTSIZE - 1]);
            if( strcmp(listA[LISTSIZE - 1], listB[LISTSIZE - 1]) == 0)
            {
                printf("\n\n\t Rozwiązanie zostało znalezione ręcznie!\n");//solution was found
                for(j = 0; j <= n; j++)
                    printf("%d ", odpowiedz[j]);//prints solution
                printf("\n\n");
                return 0;
            }
        }
    }
    else if(1 == decyzja)
    {
        printf("\n\tNastąpi automatyczne poszukiwanie rozwiązania\n");
        permute(a, 0, 3*(as - 1)); //auto mode was choosen
    }
    printf("\n\n\tNie znaleziono rozwiązania lub wprowadzono błędne dane\n");
    return 0; //no solution found
    }
    

0 个答案:

没有答案