//gcc -Wall film.c -o film #include #define WORDS_N 7 //Anzahl der Woerter #define PUZZLE_N 7 //Zeilen #define PUZZLE_M 9 //Spalten /* * Finde das naechste vorkommen des zu suchenden Buchstabens "find" */ unsigned short int find_character( char puzzle[PUZZLE_N][PUZZLE_M], char find, unsigned short int *n, unsigned short int *m ) { unsigned short int i, j; unsigned short int m_new = *m; //n, m sind die Start-Indizes for(i = *n; i < PUZZLE_N; i++) { for(j = m_new; j < PUZZLE_M; j++) { if( puzzle[i][j] == find ) { *n = i; *m = j; return 1; } } //nach der ersten Zeile muss natuerlich wieder ab Spalte 0 gesucht werden m_new = 0; } return 0; } /* * Loesen */ void solve_puzzle( char puzzle[PUZZLE_N][PUZZLE_M], char **words, unsigned short int words_n ) { unsigned short int i, j, start_n, start_m, n, m; unsigned short int ok; unsigned short int found; //Jedes einzelne Wort finden for(i = 0; i < words_n; i++) { start_n = 0; start_m = 0; found = 0; //Jedes Vorkommen des ersten Buchstaben finden while( find_character(puzzle, words[i][0], &start_n, &start_m) ) { //Von den gefundenen Indizes nach rechts suchen ok = 1; j = 1; m = start_m+1; /* * So lange nach rechts gehen bis das Wort zu Ende ist, * die Arraygrenzen erreicht sind * oder ein falscher Buchstabe kommt */ while( (words[i][j] != '\0') && ok ) { //es stimmt nicht ueberein if( (m >= PUZZLE_M) || (words[i][j] != puzzle[start_n][m]) ) { ok = 0; } m++; j++; } if( ok ) { found++; } //Von den gefundenen Indizes nach unten suchen ok = 1; j = 1; n = start_n+1; /* * So lange nach unten gehen bis das Wort zu Ende ist, * die Arraygrenzen erreicht sind * oder ein falscher Buchstabe kommt */ while( (words[i][j] != '\0') && ok ) { //es stimmt nicht ueberein if( (n >= PUZZLE_N) || (words[i][j] != puzzle[n][start_m]) ) { ok = 0; } n++; j++; } if( ok ) { found++; } /* * Neuen Index bestimmen. * Eine Spalte weiter. * Falls letzte Spalte, neue Zeile. */ start_m++; if( start_m >= PUZZLE_M ) { start_m = 0; start_n++; } } printf( "Habe '%s' %hd mal gefunden.\n", words[i], found ); } } /* * gcc -Wall wort_puzzle.c -o wort_puzzle */ int main( int argc, char **argv ) { char *words[] = {"alex", "bob", "chris", "david", "edward", "frank", "gabriel"}; char puzzle[PUZZLE_N][PUZZLE_M] = {{'g','a','b','r','i','e','l','x','l'}, {'h','f','o','d','a','v','i','d','e'}, {'a','r','b','i','b','o','b','r','i'}, {'d','a','a','v','x','e','l','a','r'}, {'e','n','l','a','l','e','x','w','b'}, {'n','k','e','d','w','a','r','d','a'}, {'c','b','x','y','z','l','a','e','g'}}; solve_puzzle(puzzle, words, WORDS_N ); return 1; }