Ханойские башни нерекурсивные неправильные шаги

Я должен написать программу, которая решит Ханойские башни. У меня есть 3 столбца, ABC, и все диски должны быть в столбце B в результате. Я должен записать шаги, которые выполняет каждый диск и в каком порядке. Я попытался написать это самостоятельно, это работает в некоторой степени. Некоторые проблемы:

  1. Числа не записаны правильно, в nj он должен вычислять nj, но это всегда 1, но это не должно быть.
  2. Шаги, которые выполняет программа, хороши только в некоторой степени, например, последние 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;
}

0 ответов

Другие вопросы по тегам