Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- typedef struct stack
- {
- int tower[13];
- int top;
- } tower;
- void InitStack(tower *towerptr, int MaxElements);
- void push ( tower *towerptr, int rod);
- int pop(tower *towerptr );
- void printower(tower *towerptr);
- int Top (tower *towerptr);
- void printalltowers(tower *towerptr[3],int N);
- void doHanoi(int total, int N, tower *towerptr[3],int from, int to, int aux);
- void populatestack(tower *towerptr,int N);
- int main ( int argc, char *argv[])
- {
- int i;
- tower *pyrgos[3];
- for (i=0;i<3;i++)
- {
- InitStack(pyrgos[i],5);
- }
- populatestack(pyrgos[0],5);
- printalltowers(pyrgos,5);
- doHanoi(5,5,pyrgos,0,2,1);
- }
- void populatestack(tower *towerptr,int N)
- {
- int i;
- for (i=0;i<N;i++)
- {
- push(towerptr,(N-i));
- }
- }
- void InitStack(tower *towerptr, int MaxElements)
- {
- int i;
- for (i=0;i<(MaxElements+1);i++)
- {
- towerptr->tower[i]=0;
- }
- towerptr->top=-1;
- }
- void push (tower *towerptr, int rod)
- {
- towerptr->tower[((towerptr->top)+1)]=rod;
- (towerptr->top)++;
- }
- int pop(tower *towerptr )
- {
- int i;
- i=towerptr->tower[towerptr->top];
- towerptr->tower[towerptr->top]=0;
- (towerptr->top)--;
- return i;
- }
- int Top(tower *towerptr )
- {
- return towerptr->tower[towerptr->top];
- }
- void printower(tower *towerptr)
- {
- int i,j;
- int size=(towerptr->top+1);
- for (i=0;i<=size;i++)
- {
- int kena=(5-towerptr->tower[(size-i)]);
- int payles=towerptr->tower[(size-i)];
- for (j=0;j<kena;j++)
- {
- printf(" ");
- }
- for (j=0;j<payles;j++)
- {
- printf("-");
- }
- printf(".");
- for (j=0;j<payles;j++)
- {
- printf("-");
- }
- for (j=0;j<kena;j++)
- {
- printf(" ");
- }
- printf("\n");
- }
- }
- void printalltowers(tower *towerptr[3],int N)
- {
- int i,j;
- int size=N;
- for (i=0;i<=size;i++)
- {
- int kena1=(N-towerptr[0]->tower[(size-i)]);
- int payles1=towerptr[0]->tower[(size-i)];
- int kena2=(N-towerptr[1]->tower[(size-i)]);
- int payles2=towerptr[1]->tower[(size-i)];
- int kena3=(N-towerptr[2]->tower[(size-i)]);
- int payles3=towerptr[2]->tower[(size-i)];
- for (j=0;j<kena1;j++)
- {
- printf(" ");
- }
- for (j=0;j<payles1;j++)
- {
- printf("-");
- }
- printf(".");
- for (j=0;j<payles1;j++)
- {
- printf("-");
- }
- for (j=0;j<kena1;j++)
- {
- printf(" ");
- }
- printf(" ");
- for (j=0;j<kena2;j++)
- {
- printf(" ");
- }
- for (j=0;j<payles2;j++)
- {
- printf("-");
- }
- printf(".");
- for (j=0;j<payles2;j++)
- {
- printf("-");
- }
- for (j=0;j<kena2;j++)
- {
- printf(" ");
- }
- printf(" ");
- for (j=0;j<kena3;j++)
- {
- printf(" ");
- }
- for (j=0;j<payles3;j++)
- {
- printf("-");
- }
- printf(".");
- for (j=0;j<payles3;j++)
- {
- printf("-");
- }
- for (j=0;j<kena3;j++)
- {
- printf(" ");
- }
- printf("\n");
- }
- printf("\n\n");
- }
- void doHanoi(int total, int N, tower *towerptr[3],int from, int to, int aux)
- {
- if (N>0)
- {
- doHanoi(total, N-1, towerptr, from, aux, to);
- push(towerptr[to],pop(towerptr[from]));
- printalltowers(towerptr,total);
- printf ("move %d --> %d\n", from, to);
- doHanoi(total, N-1,towerptr, aux, to, from);
- }
- }
Add Comment
Please, Sign In to add comment