求c语言,汉诺塔程序 非递归

c语言,汉诺塔程序 非递归

首先必须确定一个移动的方向,比如A->B->C,或者A->C->B,但这个顺序一旦却确定后就不可以再改变了的,否则永远都不会成功。
然后一直按下面两个步骤循环,直到全部完成。

1、把第一片移到下一个位置,比如原来在A,顺序是A->B->C,哪就是移到B,原来在B的就是到C,在C的 就是到A
2、把除第一片以外,可以移动的另外一片移动到可以移动的为止,这个看似模糊,但其实关系是确定的,这个时候只有一片可以移动,而且位置也只有一个可以让它移动。

就是这么两个步骤,用来完成汉诺塔

下面是我的程序

(注:我在程序中作了个弊,如果是奇数片,那顺序一定是A->C->B,(其中A是原柱,B是辅柱,C是目的柱;如果是偶数片,那顺序一定是A->B->C)

#include <stdio.h>
//#include <conio.h>
//#include <time.h>
#include <dos.h>

void henit(int n, char fromreg, char auxreg, char toreg)
{
char heni[255] = {0}, tmptoreg;
int i;

tmptoreg = toreg;

if(n%2)
{
int tmp = auxreg;
auxreg = toreg;
toreg = tmp;
}

for (i=1; i<=n; i++)
{
heni[i] = fromreg;
}

while (1)
{
if (heni[1] == fromreg)
{
heni[1] = auxreg;
printf("\t1: %c-->%c\n", fromreg, auxreg);
}
else
if (heni[1] == auxreg)
{
heni[1] = toreg;
printf("\t1: %c-->%c\n", auxreg, toreg);
}
else
if (heni[1] == toreg)
{
heni[1] = fromreg;
printf("\t1: %c-->%c\n", toreg, fromreg);
}

for (i = 1; heni[i] == tmptoreg && i<=n; i++)
;
if(i>n)
break;

for(i=1;i<=n;i++)
if(heni[i] == fromreg) break;
if(i>n)
{
heni[n+1]=fromreg;
goto Next;
}
for(i=1; i<=n; i++)
if(heni[i] == auxreg) break;
if(i>n)
{
heni[n+1]=auxreg;
goto Next;
}
for(i=1; i<=n; i++)
if(heni[i] == toreg) break;
if(i>n)
{
heni[n+1]=toreg;
goto Next;
}

Next:
for(i=2; heni[i] == heni[1] && i<=n ; i++)
;
for(int j=i+1; j<=n+1; j++)
{
if ((heni[j] != heni[1]) && (heni[j] != heni[i]) && (i<=n))
{
printf("\t%d: %c-->%c\n", i, heni[i], heni[j]);
heni[i] = heni[j];
break;
}
}
}
}

int main(void)
{
int n = 0;
//time_t start_t, end_t;
struct time start_t, end_t;

//clrscr();
printf("Input your number:");
scanf("%d", &n);
//start_t = time(NULL);
gettime(&start_t);
henit(n, 'A', 'B', 'C');
//end_t = time(NULL);
gettime(&end_t);
//printf("Ok,it is down now! use %d seconds", int(end_t - start_t));
printf("Ok,it is down now! use %2d:%02d:%02d.%02d", \
(end_t.ti_hour-start_t.ti_hour), (end_t.ti_min-start_t.ti_min), \
(end_t.ti_sec-start_t.ti_sec), (end_t.ti_hund-start_t.ti_hund));
getchar();
getchar();
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-06-29
#include <stdio.h>
#include <stdlib.h>
#define N 4

int count = 1;
int ldx(int, int);
void MoveHanoi(int, char, char);
void Hanoi(char, char, char);

int main()
{
char a = 'A',b = 'B',c = 'C';
Hanoi(a, b, c);
return 0;
}

int ldx(int a,int x)
{
int sum = 1;
for (; x > 0; x--)
{
sum *= a;
}
return sum;
}

void MoveHanoi(int j, char ch1, char ch2)
{
printf("%d (%c,%c)%d\n", j, ch1, ch2, count++);
}

void Hanoi(char a,char b,char c)
{
int n = 1,j = 1;
char temp;
if (!(N % 2))
{
temp = b;
b = c;
c = temp;
}
while (n < ldx(2,N))
{
j = 1;
while (j <= N)
{
if (n % ldx(2,j) == ldx(2,j-1))
{
if (j % 2 == 1)
{
if (n % (3 * ldx(2,j)) == ldx(2,j-1))
{
MoveHanoi(j,a,c);
break;
}
if (n % (3 * ldx(2,j)) == 3 * ldx(2,j-1))
{
MoveHanoi(j,c,b);
break;
}
if (n % (3 * ldx(2,j)) == 5 * ldx(2,j-1))
{
MoveHanoi(j,b,a);
break;
}
j++;
}
else
{
if (n % (3 * ldx(2,j)) == ldx(2,j-1))
{
MoveHanoi(j,a,b);
break;
}
if (n % (3 * ldx(2,j)) == 3 * ldx(2,j-1))
{
MoveHanoi(j,b,c);
break;
}
if (n % (3 * ldx(2,j)) == 5 * ldx(2,j-1))
{
MoveHanoi(j,c,a);
break;
}
j++;
}
}
else j++;
}
n++;
}
}本回答被网友采纳
相似回答