#include #include #define LENGTH 3 /* velikost hracího plánu */ #define SIZE (LENGTH*LENGTH) int count; /* počet permutací kostiček */ char *find; /* pole pro prohledávání do šířky -- viz text */ int perm2int(int *perm) { /* převod permutace na číslo */ int order[SIZE]; int i,j,idx=0; for(i=0;i=6) return 1; /* kontrola: není díra ve spodní řadě? */ else where=perm[SIZE-1]+3; break; case 2: /* nahoru */ if(perm[SIZE-1]<3) return 1; /* kontrola: není díra v horní řadě? */ else where=perm[SIZE-1]-3; break; case 3: /* doprava */ if(perm[SIZE-1]%3==2) return 1; /* kontrola: není díra v pravém sloupci? */ else where=perm[SIZE-1]+1; break; case 4: /* doleva */ if(perm[SIZE-1]%3==0) return 1; else where=perm[SIZE-1]-1; /* kontrola: není díra v levém sloupci? */ break; default: /* chybný tah */ return 2; } /* nyni prohodíme díru s danou kostičkou, číslo díry je 8, permutace obsahuje pro každou kostičku pozici, na níž je uložena */ i=0; /* najdeme, s čím to teda prohazujeme */ while(i4 && find[i]<=8) { /* ááá, tu jsme nalezli teprve minule */ int2perm(i,p); for(j=1;j<=4;j++) { /* zkusme postupně všechny tahy */ memcpy(r,p,SIZE*sizeof(int)); if(!move(r,j)) { /* provedeme jej, testujeme, zda je tah korektní */ n=perm2int(r); if(!find[n]) { /* vede na ještě nezpracovanou pozici? */ find[n]=j+8; /* označíme na zpracování */ added++; } } } /* tahy */ } /* permutace */ for(i=0;i4) /* zpracována v tomto tahu nebo je nová? */ find[i] -= 4; sum+=added; } } void animate(int nr) { /* `animuje' ve zpětném průchodu nalezenou cestu */ const char ch[SIZE+1] = {"12345678."}; /* výpis nalezé cesty */ int p[SIZE],p1[SIZE]; /* permutace a její inverze */ int i,j,level; if(!find[nr]) { /* nevede-li tam cesta */ printf("there's no way\n"); return; } int2perm(nr,p); /* hledáme zpětně z rozeskládané situace */ level=0; do { getchar(); printf("%2d. %6d\n\n",level++,nr); for(i=0;i