Code: Select all
[c]
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 21
#define MAX1 51
#define MAX2 301
void comb(int *count,int pos,int n,int t2,char C[],char S[][MAX1],char SO[][MAX]);
int check(char S1[],char S[][MAX1],int t,int t2);
void quicksort(char SO[][MAX],int n,int p,int r);
int p_less_than_r(char Sp[],int n,char Sr[]);
int partition(char SO[][MAX],int n,int p,int r);
main()
{int t,t1,i,j,end =0,count,k;
char S[2][MAX1],C[MAX],C1[MAX1],c,SO[MAX2][MAX];
do{
t = -1;
for(;;)
{ scanf("%c",&c);
/* printf(" c=%c Printing char in 1st loop\n",c); */
if( c == '\n' )
break;
if(c != ' ')
C[++t] = c;
}/* variables have been taken */
/* for(i=0;i<=t;i++)
printf(" %c",C[i]);
printf("\n"); */
t1=-1;count=-1;
for(;;)
{
if(scanf("%c",&c) == -1)
{ end = 1;
break;
}
if( c == '\n' )
break;
if(c != ' ')
C1[++t1] = c;
}/* constraints have been taken */
if( end != 1)/* #1 */
{
j=-1;
for(i=0;i<=t1;i++)
{ if(i %2 == 0)
{ ++j;
S[0][j] = C1[i];
}
else
S[1][j] = C1[i];
}/* Now the constraints have been put in a proper way */
/* printing the variables & the constraints */
/* for(i=0;i<=t;i++)
printf(" %c",C[i]);
printf("\nt1=%d \n The constraint line\n",t1);
for(i=0;i<=t1;i++)
printf(" %c",C1[i] );
printf("\nThe constraints\n");
for(i=0;i<= (t1-1)/2;i++)
printf(" %c < %c",S[0][i],S[1][i]);
*/
comb(&count,0,t+1,(t1 - 1)/2,C,S,SO);
/* printf("%d\n",count); */
quicksort( SO, t+1, 0, count);
for(k= 0;k<=count;k++)
printf("%s\n",SO[k]);
printf("\n");
}/* END of if #1 */
}while( end != 1);
}
/*
t=-1;
do{
if(S[++t] == '\0')
{ --t;
break;
}
}while(S[t] != '\0');
comb(0,t+1,S);
}
*/
void comb(int *count,int pos,int n,int t2,char C[],char S[][MAX1],char SO[][MAX])/* t2 = (t1 -1)/2 */
{int i,j,q;
static char S1[MAX];
if(pos==(n))
{
S1[pos]=0;
/* printf("\n Before calling check()\n");
for(i=0;i<n;i++)
printf(" %c",S1[i]);
printf("\n"); */
if( check(S1,S,n,t2)== 1)
{++(*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,t2,C,S,SO);
C[i]=S1[pos]; /* restore */
}
}
int check(char S1[],char S[][MAX1],int n,int t2)
{
int i,j,low,up;
for(i=0;i<=t2;i++)
{
low = 0;
up =0;
for(j=0;j<n;j++)
if( S[0][i] == S1[j] )
break;
low = j;
for(j=0;j<n;j++)
if( S[1][i] == S1[j] )
break;
up = j;
/* printf(" low = %d up = %d ",low,up); */
if( low > up)
return(0);
}
return(1);
}
void quicksort(char SO[][MAX],int n,int p,int r)
{int q;
/* printf("\n\n Entered quicksort\n\n");
printf("p = %d r = %d\n",p,r); */
if( p_less_than_r(SO[p],n,SO[r]) == 1){ /* ++count;
printf("%d",count); */
q = partition(SO,n,p,r);
quicksort(SO,n,p,q);
quicksort(SO,n,q+1,r);
}
return;
}
int p_less_than_r(char Sp[],int n,char Sr[])
{int i;
for(i=0;i<n;i++)
if(Sp[i] > Sr[i] )
return(0);
return(1);
}
int partition(char SO[][MAX],int n,int p,int r)
{
int i,j,k;
char S[MAX],u[MAX];
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(p_less_than_r(SO[j],n,S) == 0);
do{ ++i;
}while(p_less_than_r(SO[i],n,S) == 1);
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]