cruciverb_BROKEN.c (7701B)
1 /* Exercise 8.42 */ 2 3 #include <stdio.h> 4 #include <string.h> 5 #include <stdlib.h> 6 #include <time.h> 7 #include <ctype.h> 8 9 #define VER 12 10 #define HOR (VER + (VER / 2)) 11 12 #define BCELL 35 13 #define WCELL 46 14 15 #define WORDS 98 16 17 void gridgen(char grid[][HOR][5], int ver, int hor); 18 void insnums(char grid[][HOR][5], int ver, int hor); 19 void showgrid(char grid[][HOR][5]); 20 void inswords(char grid[][HOR][5], char const * dict[WORDS * 2 + 1]); 21 22 int main(void) 23 { 24 char grid[VER][HOR][5] = { { { 0 } } }; 25 26 char const * dict[WORDS * 2 + 1] = { 27 /* Words */ 28 "CLAUDIO", "PALERMO", "ITA", 29 "KATY", "NADIA", "DALILA", "CATRINE", "CRISTINA", 30 "QUINDICILETTERE", "QUESTESONOSEDICI", "SPACCO", 31 "TENLETTERS", "CINQUE", "THESIX", "FOUR", "SIX", 32 "SEX", "BSD", "UNIX", "GATTO", "MIAO", 33 "SIAMOATREDICI", "SIAMODIECI", "ALTREDIECI", 34 "QUATTORDICIBIS", "TRENTA", "OTTO", "UNODUETRE", 35 "PA", "ME", "EN", "CT", "TP", "CL", "SI", "RA", "AG", 36 "DODICIPAROLE", "UNGRUPPOUTENTI", "UNIXUSERGROUP", 37 "ILSETTE", "VENTOTTO", "LUG", "SUX", "OOP", "IP", "ID", 38 "EIGHTNUM", "NINEWORDS", "NOVENOVES", "QUESTESONODICIOTTO", 39 "DOMINATORIDELMONDO", "ABCDEFGHIJK", "THREE", "IDUE", "SET", 40 "POP", "DICATRENTATRE", "SHOCK", "BURNING", "DICIASSETTENUMERI", 41 "INUMERI", "ALICEADSLHOMETV4MB" "TEST", "FIGA", "QUESTAEVITA", 42 "META", "LAPROMESSA", "BLACK", "UNALTROTEN", "QUATTROGATTI", 43 "RET", "VELOCE", "POWER", "TAG", "RESTO", "ILLOOP", "SHUTDOWN", 44 "TESI", "LEGA", "NASO", "TANA", "SAGGEZZA", "CODA", "VITA", 45 "TESSERE", "LEANCORE", "GLIALBORI", "QUATTROCENTOVENTI", "CHECK", 46 "MARKED", "TV", "IPASSORICORSIVI", "GO", "VI", "SONOANCORADICIOTTO", 47 "TESTO", "CENTOVENTI", "SCACCOALLAREGINA", "QUADRO", 48 49 /* Definitions */ 50 "Lo sviluppatore di questo software", 51 "La città dello sviluppatore di questo software :-)", 52 "Uno stato europeo", 53 "Nome di donna k..", "Nome di donna na..", "Nome di donna d..", 54 "Nome di donna: ca..", "Nome di donna cr..", "tanto per", 55 "le ho contate", "ciò che faccio :P", "in inglese", "un numero", 56 "un altro numero :-)", "un quattro di quattro lettere", 57 "il numero delle sue lettere è pari alla meta del suo valore", 58 "sicurezza extrema :P", "Il tipo di Unix migliore al mondo", 59 "un sistema operativo caso ;)", "fa miao", "lo fa il gatto", 60 "numero corrente", "quante dicono di essere?", "ce ne sono..", 61 "un articolo :p", "La metà delle sue lettere per 10 dà il suo nome", 62 "Il doppio delle sue lettere diviso 2 da il suo nome", "Da uno a nove" 63 "Palermo (sigla)", "Messina (sigla)", "Enna (sigla)", "Catania (sigla)", 64 "Trapani (sigla)", "Caltanissetta (sigla)", "Siracusa (sigla)", 65 "Ragusa (sigla)", "Agrigento (sigla)", "Tante parole quante lettere su..", 66 "UUG", "UUG (sigla)", "Un numero", "Aggiungi *20* e dividi per *due*", 67 "Gruppo utenti linux", "Questo non funziona..", 68 "Programmazione orientata agli oggetti", "Internet Protocol", 69 "Identification number", "L'otto ;)", "Nove parole", 70 "Nove nove al plurale :P", "Lo dice chi le conta", "Io e Claudio ;)", 71 "Le prime undici", "Tre con cinque", 72 "Anche se tanti, solo due.. con 4 (lol)", 73 "Si usa per impostare qualcosa su qualsiasi shell", 74 "In assembler si usa per rimuovere..", "Lo dice il dottore", 75 "effetto provato dall'hiphop di Claudio :-)", "Masterizzando", 76 "Il numero di lettere in esso scritto corrisponde alle sue lettere (uhm?)", 77 "Una generalizzazione matematica..", "prova", "ce n'è in abbondanza :-)", 78 "Lo dice che stà bene", "La insegue il viaggiatore", 79 "Somiglia a un giuramento :-)", "Nero", "Ancora uno", "Lo sono in pochi", 80 "Valore di ritorno", "Claudio scrive..", "Accende il PC", 81 "L'html ne è pieno", "L'operatore col simbolo di percentuale", 82 "Il *ciclo* storpiato", "Arresto del sistema", "La si sà per la laurea", 83 "L'insieme dei materiale che costituiscono un oggetto", 84 "Lo possiede chi ci sa fare", "Vi rimane chi si nasconde", 85 "La possiede chi apprende dalle esperienze altrui", 86 "Il gatto ne ha più di una", "L'uomo ne ha una soltanto", 87 "Si presentano all'ingresso", "Le navi ne hanno almeno due", 88 "Quando tutto cominciò", 89 "140 più il numero delle sue lettere * 3 dà il numero in esso scritto :-)" 90 "Controllo", "Spuntato, visitato", "La vecchia scatola magica", 91 "Una solo può generarne molti", "Andare", "L'editor per eccellenza ;)", 92 "Ne ho aggiunte ancora", "Lo scrive il cantante", "60 * 2 :)", 93 "lo si fa alla moglie del re", 94 "Lo si trova in gallerie d'arte e in ogni videogame :-)" 95 }; 96 97 srand( time(NULL) ); 98 99 gridgen(grid, VER, HOR); 100 /* inswords(grid, dict); */ 101 showgrid(grid); 102 103 return 0; 104 } /* E0F main */ 105 106 /* ehm.. show the grid :-) */ 107 void showgrid(char grid[][HOR][5]) 108 { 109 int i, j; 110 for(i = 0; i < VER; i++) { 111 for(j = 0; j < HOR; j++) 112 printf("%4s", grid[i][j]); 113 printf("\n"); 114 } 115 } 116 117 /* create an empty grid */ 118 void gridgen(char grid[][HOR][5], int ver, int hor) 119 { 120 int i, j; 121 122 for(i = 0; i < ver; i++) { 123 for(j = 0; j < hor; j++) { 124 if( !(rand() % 5) ) 125 *grid[i][j] = BCELL; 126 else 127 *grid[i][j] = WCELL; 128 } 129 } 130 131 insnums(grid, ver, hor); 132 133 } /* eof gridgen() */ 134 135 /* insert the numbers to an empty grid */ 136 void insnums(char grid[][HOR][5], int ver, int hor) 137 { 138 int i, j, num = 1; 139 140 for(i = 0; i < ver; i++) { 141 for(j = 0; j < hor; j++) { 142 143 if(*grid[i][j] == BCELL) 144 continue; 145 146 if( /* Toggle the closed cells */ 147 (*grid[i - 1][j] == BCELL || !i) && 148 (*grid[i + 1][j] == BCELL || i == ver - 1) && 149 (*grid[i][j + 1] == BCELL || j == hor - 1) && 150 (*grid[i][j - 1] == BCELL || !j) 151 ) { 152 153 if(j < hor - 1) { 154 *grid[i][j + 1] = WCELL; 155 --j; 156 } 157 else if( i < ver - 1 ) { 158 *grid[i + 1][j] = WCELL; 159 } 160 else { /* Latest cell down/right */ 161 *grid[i][j] = BCELL; 162 } 163 } 164 165 else if( /* Check the cell to put it the number */ 166 ((*grid[i][j - 1] == BCELL || !j) && 167 (*grid[i][j + 1] != BCELL && j < hor - 1)) || 168 ((*grid[i - 1][j] == BCELL || !i) && 169 (*grid[i + 1][j] != BCELL && i < ver - 1)) 170 ) { 171 172 if( num <= 9 ) { 173 *grid[i][j] = num + (int)'0'; 174 } 175 else if(num <= 99) { 176 grid[i][j][0] = num / 10 % 10 + '0'; 177 grid[i][j][1] = num % 10 + '0'; 178 } 179 else if(num <= 999) { 180 grid[i][j][0] = num / 100 % 10 + '0'; 181 grid[i][j][1] = num / 10 % 10 + '0'; 182 grid[i][j][2] = num % 10 + '0'; 183 } 184 ++num; 185 186 } 187 } 188 } 189 } /* eof insnums() */ 190 191 /* Insert the words to the cruciverb */ 192 void inswords(char grid[][HOR][5], char const * dict[WORDS * 2 + 1]) 193 { 194 int i, j, k, x, len; 195 int done[WORDS] = { 0 }; 196 197 for(i = 0; i < VER; i++) { 198 for(j = 0, len = 0; j <= HOR; j++) { 199 200 /* Found a delimiter (BCELL or right border) */ 201 if( (*grid[i][j] == BCELL || j == HOR) && len ) { 202 203 k = -1; /* Count the string */ 204 while(++k < WORDS * 2) { 205 if( *dict[k] != 1 && 206 (int)strlen(dict[k]) == len && 207 done[k] != '*' ) 208 break; 209 } 210 211 /* Overwrite the token with the string */ 212 if(k < WORDS) { 213 done[k] = '*'; /* Marked as inserted */ 214 215 x = k; 216 for(k = 0; k < len; k++) { 217 218 grid[i][j - len + k][0] = ' '; /* clean */ 219 grid[i][j - len + k][1] = dict[x][k]; 220 grid[i][j - len + k][2] = '\0'; /* clean */ 221 222 223 } 224 } 225 226 len = 0; 227 } 228 else { /* Increment the token size */ 229 ++len; 230 } 231 } 232 } 233 } /* eof inswords() */ 234