/*--------------------------------------------------------------------------------------------
	4_visszalepeses_kereses.c

*/

/*A feladat ELEMSZAM db egész elem koze  muveleti '+','-' jeleket irni ugy, hogy az eredmeny EREDMENY legyen */
/*a muveletek kiprobalasanak precedencia-sorrendje: '+','-'  */
/*most minden megoldast megkeresunk*/

#include <stdio.h>
#define ELEMSZAM 10
#define MUVJELSZAM ELEMSZAM-1
#define EREDMENY 0						/*elvart vegeredmeny*/

char kovetkezo(char c);											
int change(char muvjelek[]);
long int kiszamol2(int szamok[], char muvjelek[]);		/*eredmeny kiszamitasa*/

/*--------------------------------------------------------------------------------------------*/

main()
{
	int i,nincstobb=0;
	long int eredmeny;
	int szamok[ELEMSZAM] = {-4,144,3,5,10,11,23,5,2,1};
	char muvjelek[MUVJELSZAM];

	printf("A feladat %d egesz elem koze muveleti jeleket irni ugy, hogy az eredmeny %d legyen\n",ELEMSZAM,EREDMENY);
	for (i=0;i<MUVJELSZAM ;i++) muvjelek[i]='+';			/*kezdeti probasorozat*/ 

	do
	{
		eredmeny=kiszamol2(szamok,muvjelek);
		if (eredmeny==EREDMENY)
		{
			printf("\nA kapott megoldas:\n");
		    printf("%d",szamok[0]);
			for (i=0;i<MUVJELSZAM ;i++ )
				printf("%c%d",muvjelek[i],szamok[i+1]);
        }
		nincstobb=change(muvjelek);

	} while( /*(eredmeny!=EREDMENY)&&*/ !nincstobb );		/*addig csinaljuk,amig van meg kiprobalatlan eset*/
	return 0;
}

/*--------------------------------------------------------------------------------------------*/

int change(char muvjelek[] )
{
	int i;
	for(i=MUVJELSZAM-1;i>=0;i--)
	{
		muvjelek[i]=kovetkezo(muvjelek[i]);
		if ( muvjelek[i]!='+' )
			break;						/*nem kell felsobb szinten valtoztatni*/
		else if (i==0)						/*nincs feljebb szint*/	
			return 1;	 				/* a nulladik szinten is mindent kiprobaltunk, nincs tobb lehetoseg*/
	}
	return 0;							/*lesz meg tovabbi lehetoseg*/
};

/*--------------------------------------------------------------------------------------------*/

char kovetkezo(char c)
{
	switch (c)
	{
		case '+' : c='-';break;	 /*!!csak a masolaton dolgozik, kivulrol nem latszik!*/
		case '-' : c='*';break;
		case '*' : c='+';break;
	}
	return(c);
}

/*--------------------------------------------------------------------------------------------*/

int kiszamol(int szamok[], char muvjelek[])
{
	int i;
	int temp;							/*az eddigi eredmeny*/
	temp=szamok[0];
	for(i=0;i<=MUVJELSZAM-1;i++)
	{
		switch(muvjelek[i])
		{
			case '+' :	temp=temp+szamok[i+1];
							break;
			case '-' :	temp=temp-szamok[i+1];
							break;
		}
	}
return temp;
}

/*--------------------------------------------------------------------------------------------*/

long int kiszamol2(int szamok[], char muvjelek[])
{
	int i=MUVJELSZAM-1;
	long int akt=szamok[MUVJELSZAM],temp=0;	/*az eddigi eredmeny*/
 	while (i>=0)
	{
		switch(muvjelek[i])
		{
			case '+' :	temp+=akt;
							akt=szamok[i];
							i--;
							break;
			case '-' :	temp-=akt;
							akt=szamok[i];
							i--;
							break;
			case '*' :	akt*=szamok[i];
							i--;
							break;
		}
	}
	temp+=akt;
	return temp;
}
