/* written by Andrew Tridgell (May 1992) */ #include #include #include #include #include int xsize=0; int ysize=0; char **grid; char *wordfile; char **wordlist=NULL; int num_words=0; enum _Direction{ACROSS,DOWN}; typedef enum _Direction Direction; typedef int BOOL; #define True 1 #define False 0 #define CONST const #define LONG_STRING_LENGTH 200 char *strtidy(); void read_a_line(); char *my_fgets(); #ifndef MSDOS #define randomize() srand(time(NULL)) #define ctrlbrk(fn) #define BLACKSQUARE '#' #else #define BLACKSQUARE 'Û' #endif /******************************************************************* create a matrix of any dimension. The return must be cast correctly. ********************************************************************/ void *any_matrix(va_alist) va_dcl { int dimension; int el_size; int *dims=NULL; void **mat; int i,j,size,ptr_size,ppos,prod; int padding; void *next_ptr; va_list ap; /* first gather the arguments */ va_start(ap); dimension = va_arg(ap, int); el_size = va_arg(ap, int); if (dimension <= 0) return(NULL); if (el_size <= 0) return(NULL); dims = (int *)malloc(dimension * sizeof(int)); if (dims == NULL) return(NULL); for (i=0;i 0) && (strchr(chars,*str) != NULL)) { memcpy(str,&str[1],len); len--; } while ((len > 0) && (strchr(chars,str[len-1]) != NULL)) { str[len-1]=0; len--; } return(str); } /******************************************************************* load a list of words ********************************************************************/ char **load_word_list(char *fname,int *num) { FILE *file; int i; char line[LONG_STRING_LENGTH]; char **list; *num = num_text_lines(fname); if (*num < 1) return(NULL); list = (char **)malloc(sizeof(char *)*(*num)); file = fopen(fname,"r"); for (i=0;i<(*num);i++) { read_a_line(line,LONG_STRING_LENGTH,file); list[i] = (char *)malloc(strlen(line)+1); strcpy(list[i],line); } fclose(file); return(list); } /******************************************************************* place a word ********************************************************************/ void PlaceWord(char *word,int i,int j,Direction dir) { int k; int len=strlen(word); if (dir == ACROSS) { for (k=0;k xsize) return(False); if ((i != 0) && grid[i-1][j]) return(False); if (((i+len) != xsize) && grid[i+len][j]) return(False); for (k=0;k ysize) return(False); if ((j != 0) && grid[i][j-1]) return(False); if (((j+len) != ysize) && grid[i][j+len]) return(False); for (k=0;k best || ((s == best) && ((random_num()%(xsize*ysize/4))!=0))) { best = s; *besti = i; *bestj = j; *dir = d; } } d = DOWN; if (Legal(word,i,j,d)) { s = Score(word,i,j,d); if (last_dir != d) s++; if (s > best || ((s == best) && ((random_num()%(xsize*ysize/4))!=0))) { best = s; *besti = i; *bestj = j; *dir = d; } } } return(best >= 0); } /******************************************************************* zero a crossword ********************************************************************/ void zero_crossword(void) { int i,j; for (i=0;i 0) { int choose=-1; while (choose==-1) { choose = random_num() % num; if (used[choose]) choose=-1; } used[choose] = True; remaining--; if (BestPosition(list[choose],&i,&j,&d)) PlaceWord(list[choose],i,j,d); else bad++; } return(num-bad); } /******************************************************************* build a crossword ********************************************************************/ int BuildBestCrossword(char **list,int num) { int i,j; Direction d; int remaining=num; int bad=0; BOOL *used = (BOOL *)malloc(sizeof(BOOL)*num); int *scores = (int *)malloc(sizeof(int)*num); for (i=0;i 0) { int n; int choose; for (i=0;i bestscore) { bestscore = scores[n]; numbest = 1; } } if (bestscore < 0) return(num-remaining); k = random_num() % numbest; numbest=0; for (n=0;n best) { best = n; copy_to(bestgrid); printf("\nplaced %d words\n",best); { FILE *f = fopen("best.doc","w"); DisplayCrossword(stdout); DisplayCrossword(f); SavePuzzle("best.pzl"); fclose(f); } } fflush(stdout); } }