#include #include #include static char *dict[] = { "aaaa", "aaab", "aaac", "aabb", "babb", "bbbb" }; static int *skip; static int dictlen = 6; /* 3 out of 4 characters should match */ static int match3(const char *word1, const char *word2) { int match = 0, i; for (i = 0; i < 4; ++i) if (word1[i] == word2[i]) ++match; return match == 3; } /* Because this algorythm is recursive, the printing is done inverted * to compensate for that, the word order is reverted, too */ int trymatch(char *destword, int whichwordnow) { int i; /* Easiest case */ if (match3(dict[whichwordnow], destword)) { printf("%s -> %s", destword, dict[whichwordnow]); return whichwordnow; } /* Try to recursively call all words 1 away from current word */ for (i = 0; i < dictlen; ++i) if (!skip[i] && match3(dict[i], dict[whichwordnow])) { int ret; skip[i] = 1; ret = trymatch(destword, i); if (ret >= 0) { printf(" -> %s", dict[whichwordnow]); return i; } } return -1; } int main() { char word[5] = "aaaa"; char targetword[5] = "bbbb"; int moi = -1, i; skip = malloc(sizeof(int) * dictlen); if (!skip) return 1; /* Fill dict, allocate skip */ memset(skip, 0, sizeof(int) * dictlen); /* First the easiest case */ if (!strcasecmp(word, targetword)) { printf("Nothing to do.\n"); return 0; } /* Convert targetword into a dictionary word */ for (i = 0; i < dictlen; ++i) if (!strcasecmp(targetword, dict[i])) { moi = i; skip[i] = 1; break; } if (moi == -1) { printf("Error: '%s' not in dictionary!\n", targetword); return 1; } /* Do the magic, find the way to transform targetword into original word */ int ret = trymatch(word, moi); if (ret == -1) { printf("Could not change '%s' to '%s'\n", word, targetword); return 1; } printf("\n"); return 0; }