look at this AC one,it's very easy to understand!! program hanoi; var step:longint; i,n:integer; goal:array[1..31] of byte; procedure p(k:integer;a,b,c:integer); begin if k=0 then exit; if goal[k]=b then begin step:=step+trunc(exp((k-1)*ln(2))); p(k-1,c,b,a); end else if goal[k]=c then begin writeln(-1); halt; end else p(k-1,a,c,b); end; begin readln(n); for i:=1 to n do read(goal[i]); step:=0; p(n,1,2,3); writeln(step); end. Re: look at this AC one,it's very easy to understand!! here's mine #include <stdio.h> int n, s[50], s1[] = {0, 1, 2, 2, 3, 3, 1, 1, 2, 2, 3, 3, 1}, s2[] = {0, 1, 3, 3, 2, 2, 1, 1, 3, 3, 2, 2, 1}; int is(int lev, long pos) { if (pos % 12 == 0) pos++; return (lev & 1) ? s1[pos % 12] : s2[pos % 12]; } long baga_mare(int lev, long pos) { long fiu; if (lev == n) return pos; fiu = 2 * pos - 1; if (s[n - lev] == is(lev + 1, fiu)) return baga_mare(lev + 1, fiu); fiu = 2 * pos; if (s[n - lev] == is(lev + 1, fiu)) return baga_mare(lev + 1, fiu); return 0; } int main() { int i; scanf("%d", &n); for (i = 1; i <= n; scanf("%d", s + i++)); printf("%ld\n", baga_mare(0, 1) - 1); return 0; } |