#include #include #define MAX_SLOVNIK 8192 /* pocet pismen slovniku */ #define MAX_ROZMER 80 /* maximalni rozmer osmismerky */ #define UNDEFINED (-1) /* konstanta pro nedefinovanou hodnotu fce g */ #define max(x,y) ((x)>(y)?(x):(y)) #define min(x,y) ((x)<(y)?(x):(y)) int g[MAX_SLOVNIK][256]; /* prechodova fce g: stavy $\times$ abeceda $\rightarrow$ stavy */ int o[MAX_SLOVNIK]; /* maximalni delka prijmuteho slova v tomto stavu */ int f[MAX_SLOVNIK]; /* zpetna fce f: stavy $\rightarrow$ stavy */ int osmismerka[MAX_ROZMER][MAX_ROZMER]; int skrt[MAX_ROZMER][MAX_ROZMER]; int m,n; void vytvor_automat(char *jmeno) { FILE *fin; char word[80],p; int i,j,r,s,t,q; int queue[MAX_SLOVNIK]; int qtail,qhead; fin=fopen(jmeno,"r"); /* zalozime inicialni vrchol 0, fce g je nedifinovana pro kazde pismeno*/ q=1;o[0]=0; for (i=0;i<256;i++) g[0][i]=UNDEFINED; /* kazde prectene slovo vlozime do stromu automatu normalne i zrcadlove */ while (fscanf(fin,"%s",word)==1) for (r=0;r<2;r++) /* kvuli zrcadleni ... */ { /* nejdrive jdeme ve stromu tak dlouho dokud existuje cesta */ s=0; for(j=0;j0) { f[g[0][i]]=0; queue[qtail++]=g[0][i]; } /* vsem stavum ve fronte zpracuj jejich potomky a definuj jim o a f */ while (qhead=0;i--) { x-=dx;y-=dy; mez=min(mez,i-intervaly[i]); if (i>mez) skrt[x][y]=1; } } void skrtej(void) { int i,j; for (i=0;i0?i:0,i>0?0:(-i),1,1, min(n-(i>0?i:0),m-(i>0?0:(-i)))); for (i=0;i