Posted: Sat Mar 02, 2002 2:13 pm
Maybe you're just too restrictive on the length of the string? Try 5000 instead of 50.
Code: Select all
[c]
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 20
#define MAX1 50000
int fact(int n);
void func(char s[],int t);
void comb(int n,char C[],char S[][MAX]);
void quicksort(char A[],int p,int r);
int partition(char A[],int p,int r);
main()
{ int i,n,t;
char s[MAX];
gets(s);
n = atoi(s);
/* printf("\n %d",n); */
for(i=0;i<n;i++)
{ gets(s);/* printf("\n %s",s); */
t=-1;
do{
if(s[++t] == '\0')
{ --t;
break;
}
}while(s[t] != '\0');
/* printf("\n %s",s);
printf("\n i = %d t= %d",i,t); */
if(i != 0)
printf("\n");
func(s,t);
}
printf("\n");
}
int fact(int n)
{
if(n==0)
return(1);
if(n == 2 || n== 1)
return(n);
else
return(n*fact(n-1) );
}
void func(char s[],int t)/* t = num of char - 1 */
{char S[MAX1][MAX];
int i,j,repeat =0,u,check;
/* printf("\n Inside func() s= %s\n",s);
for(i=0;i<=t;i++)
printf(" %c",s[i]); */
quicksort(s,0,t);
/* printf("\n After quick sort: \n");
for(i=0;i<=t;i++)
printf(" %c",s[i]); */
for(i=0;i<t;i++)
if(s[i] == s[i+1])
repeat = 1;
/* printf("\nrepeat = %d\n",repeat); */
comb(t+1,s,S);
/* printf("\n Inside func() After comb() s= %s\n",s); */
if(repeat == 0)
{
for(i=0;i< fact(t+1) ;i++)
{if(i != 0)
printf("\n");
for(j=0;j<= t;j++)
printf("%c",S[i][j]);
}
}
else
{
for(i=0;i< fact(t+1) ;i++)
{ if(i==0)
printf("%s",S[i]);
else{check = 0;
for(u=i-1;u>=0;u--)
if( strcmp(S[u],S[i]) == 0 )
{ check=1;
break;
}
if(check == 0)
printf("\n%s",S[i]);
}
}
}
return;
}
void quicksort(char A[],int p,int r)
{int q,count=0;
/* printf("\n\n Entered quicksort\n\n");
printf("p = %d r = %d\n",p,r); */
if(p<r){ ++count;
/* printf("%d",count); */
q = partition(A,p,r);
quicksort(A,p,q);
quicksort(A,q+1,r);
}
return;
}
int partition(char A[],int p,int r)
{ char x,u;
int i,j;
x = A[p];
i = p-1;
j = r+1;
while(1){
do{--j;
}while(A[j]>x);
do{ ++i;
}while(A[i]<x);
if(i < j)
{ u = A[i] ;
A[i]= A[j];
A[j] = u;
}
else
return(j);
}
}
void comb(int n,char C[],char S[][MAX])
{ int i,j,t,u,e;
static int count =0;
char C1[MAX],S1[MAX1][MAX];
/* printf("\n Inside comb n = %d",n); */
if(n==2)
{
S[0][0] = C[0];
S[0][1] = C[1];
S[1][0] = C[1];
S[1][1] = C[0];
return;
}
if(n > 2)
{
for(i=0;i<n;i++)/* #a */
{
t= -1;
for(j=0;j<n;j++)
if(j != i)
C1[++t] = C[j];
/* printf("\ncount = %d t= %d Elements of C1 are: ",count,t);
for(j=0;j<=t;j++)
printf(" %c",C1[j] ); */
comb(n-1,C1,S1);
/* printf("\ncount = %d Inside comb itself n-1 = %d",++count,n-1);
for(e=0;e< fact(n-1) ;e++)
{ printf("\n");
for(j=0;j< n-1;j++)
printf("%c",S1[e][j]);
} */
for(j= i*fact(n-1) ;j< (i+1)*fact(n-1) ;j++)
{ S[j][0] = C[i];
for(u=0;u<n-1;u++)
S[j][u+1]= S1[j - i*fact(n-1)][u];
}
}/* END of for #a */
return;
}
}
[/c]
Code: Select all
[c]
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
#define MAX1 50000
void comb(int *count,int pos,int n,char C[],char SO[][MAX]);
void quicksort(char SO[][MAX],int n,int p,int r);
int partition(char SO[][MAX],int n,int p,int r);
main()
{ int i,n,t,count,k;
char S[MAX],SO[MAX1][MAX];
gets(S);
n = atoi(S);
printf(" %d\n",n);
for(i=0;i<n;i++)
{ gets(S);/* printf("\n %s",s); */
t=-1;
do{
if(S[++t] == '\0')
{ --t;
break;
}
}while(S[t] != '\0');
count = -1;
printf("\n %s",S);
printf("\n i = %d t= %d\n",i,t);
comb(&count,0,t+1,S,SO);/* make all the combinations */
printf("\n After comb()\n");
printf("%d\n",count);
for(k= 0;k<=count;k++)
printf(" %s\n",SO[k]);
quicksort( SO, t+1, 0, count);
for(k= 0;k<=count;k++)
{
if(k=0 || k>0 && strcmp(SO[k],SO[k-1])!= 0 )
printf("%s\n",SO[k]);
}
/* if(i != 0)
printf("\n");
func(s,t); */
}
}
void comb(int *count,int pos,int n,char C[],char SO[][MAX])
{int i,j,q;
static char S1[MAX];
printf("\n Entered comb()\n");
if(pos==(n))
{
S1[pos]=0;
/* printf("\n Before calling check()\n");
for(i=0;i<n;i++)
printf(" %c",S1[i]);
printf("\n"); */
++(*count);
printf("%s\n",S1);
for(j=0;j<n;j++)
SO[*count][j] = S1[j];
}
else
for( i=0;i<n;++i)
if(C[i])
{
S1[pos]=C[i];
C[i]=0; /*mark as used */
comb(count,pos+1,n,C,SO);
C[i]=S1[pos]; /* restore */
}
}
void quicksort(char SO[][MAX],int n,int p,int r)
{int q,k;
printf("\n Entered quicksort");
printf(" p = %d r = %d",p,r);
if(p < r){ /* ++count;
printf("%d",count); */
q = partition(SO,n,p,r);
printf("\n q = %d p=%d r=%d",q,p,r);
for(k= p;k<=r;k++)
printf(" %s\n",SO[k]);
//exit(1);
quicksort(SO,n,p,q);
quicksort(SO,n,q+1,r);
}
return;
}
int partition(char SO[][MAX],int n,int p,int r)
{
int i,j,k;
char S[MAX],u[MAX];
printf("\n Entered partition");
printf(" p = %d r = %d",p,r);
for(k=0;k<n;k++)
S[k] = SO[p][k];
/* x = A[p]; */
i = p-1;
j = r+1;
while(1){
do{--j;
}while(strcmp(SO[j],S) > 0);
do{ ++i;
}while(strcmp(SO[i],S) < 0);
if(i < j)
{ for(k=0;k<n;k++)
u[k] = SO[i][k];
for(k=0;k<n;k++)
SO[i][k] = SO[j][k];
for(k=0;k<n;k++)
SO[j][k]= u[k];
}
else
return(j);
}
}
[/c]
Code: Select all
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
#define MAX1 50000
void comb(int *count,int pos,int n,char C[],char SO[][MAX]);
void quicksort(char SO[][MAX],int n,int p,int r);
int partition(char SO[][MAX],int n,int p,int r);
main()
{ int i,n,t,count,k;
char S[MAX],SO[MAX1][MAX];
gets(S);
n = atoi(S);
printf(" %d\n",n);
printf("\n CHECK %d\n",strcmp("aAb","Aab") );//exit(1);
for(i=0;i<n;i++)
{ gets(S);/* printf("\n %s",s); */
t=-1;
do{
if(S[++t] == '\0')
{ --t;
break;
}
}while(S[t] != '\0');
count = -1;
printf("\n %s",S);
printf("\n i = %d t= %d\n",i,t);
comb(&count,0,t+1,S,SO);/* make all the combinations */
printf("\n After comb()\n");
printf("%d\n",count);
for(k= 0;k<=count;k++)
printf(" %s\n",SO[k]);//exit(1);
quicksort( SO, t+1, 0, count);
//qsort(SO,count,t+1);
for(k= 0;k<=count;k++)
{
if(k==0 || k>0 && strcmp(SO[k],SO[k-1])!= 0 )
printf("%s\n",SO[k]);
}
/* if(i != 0)
printf("\n");
func(s,t); */
}
}
void comb(int *count,int pos,int n,char C[],char SO[][MAX])
{int i,j,q;
static char S1[MAX];
printf("\n Entered comb()\n");
if(pos==(n))
{
S1[pos]=0;
/* printf("\n Before calling check()\n");
for(i=0;i<n;i++)
printf(" %c",S1[i]);
printf("\n"); */
++(*count);
printf("%s\n",S1);
for(j=0;j<n;j++)
SO[*count][j] = S1[j];
SO[*count][n] = '\0';
}
else
for( i=0;i<n;++i)
if(C[i])
{
S1[pos]=C[i];
C[i]=0; /*mark as used */
comb(count,pos+1,n,C,SO);
C[i]=S1[pos]; /* restore */
}
}
void quicksort(char SO[][MAX],int n,int p,int r)
{int q,k;
printf("\n Entered quicksort");
printf(" p = %d r = %d",p,r);
if(p < r){ /* ++count;
printf("%d",count); */
q = partition(SO,n,p,r);
printf("\n q = %d p=%d r=%d",q,p,r);
for(k= p;k<=r;k++)
printf(" %s\n",SO[k]);
//exit(1);
quicksort(SO,n,p,q);//exit(1);
quicksort(SO,n,q+1,r);//exit(1);
}
return;
}
int partition(char SO[][MAX],int n,int p,int r)
{
int i,j,k;
char S[MAX],u[MAX];
printf("\n Entered partition");
printf(" p = %d r = %d",p,r);
for(k=0;k<n;k++)
S[k] = SO[p][k];
/* x = A[p]; */
i = p-1;
j = r+1;
while(1){
do{--j;
}while(strcmp(SO[j],S) > 0);
do{ ++i;
}while(strcmp(SO[i],S) < 0);
if(i < j)
{ for(k=0;k<n;k++)
u[k] = SO[i][k];
for(k=0;k<n;k++)
SO[i][k] = SO[j][k];
SO[i][n] = '\0';
for(k=0;k<n;k++)
SO[j][k]= u[k];
SO[i][n] = '\0';
}
else
return(j);
}
}