所以我编写了一个程序,其目的是解决PCP问题,它适用于大多数问题,例如维基百科上发现的问题,但是当我从Hopcroft& amp; Ullman的书中显示了分段错误(当自动解决时),当我选择手动选项时,它使用与我输入的完全不同的数据使问题无法解决(我认为这就是为什么它在自动解决时崩溃的原因)
快速介绍计划的运作方式:
用户将元素输入到每个列表A和B
用户选择手动解决或让程序找到其中一个解决方案。
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
}