Ханойские башни нерекурсивные неправильные шаги
Я должен написать программу, которая решит Ханойские башни. У меня есть 3 столбца, ABC, и все диски должны быть в столбце B в результате. Я должен записать шаги, которые выполняет каждый диск и в каком порядке. Я попытался написать это самостоятельно, это работает в некоторой степени. Некоторые проблемы:
- Числа не записаны правильно, в nj он должен вычислять nj, но это всегда 1, но это не должно быть.
- Шаги, которые выполняет программа, хороши только в некоторой степени, например, последние 3 или 4 шага всегда неверны.
Что я написал неправильно?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main() {
int n,i,j,k,first_pos,last_pos,num_ofsteps,num;
char first_peg,next_peg;
printf("Enter the number of disks: ");
scanf("%d",&n);
int a[n];
for (i=0;i<n;++i) {
a[i]=0;
}
num_ofsteps = pow(2,n);
first_pos = 0;
last_pos = n-1;
for (i=0;i<num_ofsteps-1;++i) {
if (i%2==0) {
if (a[n-1]==0) {
a[n-1] = 1;
printf("1 steps: A->B\n");
} else if (a[n-1]==1) {
a[n-1] = 2;
printf("1 steps: B->C\n");
} else if (a[n-1]==2) {
a[n-1] = 0;
printf("1 steps: C->A\n");
}
} else {
for (j=n-1;j>=0;--j) {
if (a[j]!=a[j-1]) {
if ((a[j]==0 && a[j-1]==1) || (a[j]==1 && a[j-1]==0)) {
next_peg = 'C';
} else if ((a[j]==1 && a[j-1]==2) || (a[j]==2 && a[j-1]==1)) {
next_peg = 'A';
} else if ((a[j]==0 && a[j-1]==2) || (a[j]==2 && a[j-1]==0)) {
next_peg = 'B';
}
num=n-j;
if (a[j-1]==0) {
first_peg = 'A';
a[j-1] = 1;
printf("%d steps: %c->%c\n",num,first_peg,next_peg);
break;
} else if (a[j-1]==1) {
first_peg = 'B';
a[j-1] = 2;
printf("%d steps: %c->%c\n",num,first_peg,next_peg);
break;
} else if (a[j-1]==2) {
first_peg = 'C';
a[j-1] = 0;
printf("%d steps: %c->%c\n",num,first_peg,next_peg);
break;
}
}
}
}
}
return 0;
}