#include #include #include char pole[31][33]; struct limit { unsigned char maxx,minx,maxy,miny; } limit['Z'-'A'+1], *lptr; char znaky[30]; char res[5000][30]; int h,w, rcount; int ontop(const char c) { int i; struct limit *l=&limit[c-'A']; for (i=l->minx; i<=l->maxx; ++i) if ( ((pole[l->miny][i] != c) && (pole[l->miny][i] != '*')) || ((pole[l->maxy][i] != c) && (pole[l->maxy][i] != '*')) ) return 0; for (i=l->miny; i<=l->maxy; ++i) if ( ((pole[i][l->minx] != c) && (pole[i][l->minx] != '*')) || ((pole[i][l->maxx] != c) && (pole[i][l->maxx] != '*')) ) return 0; return 1; } void replace(const char c, const char to) { int i; struct limit *l=&limit[c-'A']; for (i=l->minx; i<=l->maxx; ++i) { pole[l->miny][i] = to; pole[l->maxy][i] = to; } for (i=l->miny; i<=l->maxy; ++i) { pole[i][l->minx] = to; pole[i][l->maxx] = to; } } void find(char *zbyvajici, char *nalezene) { int i; char *s; for (s=zbyvajici; *s; ++s) if (ontop(*s)) { char zb[30] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; char str[30] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; char *p1,*p2, backup[31][33]; strcpy(str,nalezene); str[strlen(str)] = *s; for (p1=zbyvajici,p2=zb; *p1; ++p1) if (*p1 != *s) *p2++ = *p1; if (!*zb) { res[rcount][i=strlen(s=str)] = '\0'; while (i) res[rcount][--i] = *s++; rcount++; return; } /* printf("found %c\nfind('%s', '%s')\n", *s, zb,str);*/ memcpy(backup, pole, sizeof(backup)); replace(*s, '*'); /* for(i=0; iminx) lptr->minx = x; if (y < lptr->miny) lptr->miny = y; if ((x > lptr->maxx) || (lptr->maxx == 99)) lptr->maxx = x; if ((x > lptr->maxy) || (lptr->maxy == 99)) lptr->maxy = y; } } rcount=0; for (i=0; i<=('Z'-'A'); ++i) if (znaky[i]) zcount++; find(znaky, ""); if (rcount > 1) { int comp(const void* a,const void *b) {return strcmp(a,b);} qsort(res, rcount, 30, comp); } for (i=0; i