大小寫視為相同。
找到字首後,從其四面八方找第二個字母,
找到第二個字母後,繼續從該路線找第三個字母,
一直到最後一個字母,若都有找到,就是找到了,
要不然就從下一個路線開始,
路線都沒找到,就從下一個點開始。
要考慮邊界問題。
很懶的用了一堆全域變數。
/* ACM 10010 Where's Waldorf?
* mythnc
* 2011/12/16 12:31:16
* run time: 0.008
*/
#include <stdio.h>
#define MAXF 50
#define MAXK 20
#define DIRC 8
#define RANGE(X, Y) X >= 0 && X < maxrow && Y >= 0 && Y < maxcol
#define TRUE 1
#define FALSE 0
void findword(void);
int move(int, int, int);
int sameletter(char, char);
char square[MAXF][MAXF + 1];
char word[MAXK][MAXF + 1];
int maxrow, maxcol, kword;
int main(void)
{
int n, i, j, set;
scanf("%d", &n);
for (i = set = 0; i < n; i++) {
/* input data */
scanf("%d %d", &maxrow, &maxcol);
getchar(); /* eat newline */
for (j = 0; j < maxrow; j++)
scanf("%s", square[j]);
scanf("%d", &kword);
getchar(); /* eat newline */
for (j = 0; j < kword; j++)
scanf("%s", word[j]);
/* blank line in each set */
if (set == 1)
putchar('\n');
findword();
set = 1;
}
return 0;
}
/* findword: find the word position */
void findword(void)
{
int i, j, k, find;
for (i = 0; i < kword; i++) {
for (find = j = 0; j < maxrow && !find; j++)
for (k = 0; k < maxcol && !find; k++)
if (sameletter(word[i][0], square[j][k]))
find = move(i, j, k);
if (find)
printf("%d %d\n", j, k);
}
}
/* move: move around from (r, c),
* if find return TRUE, else return FALSE */
int move(int n, int r, int c)
{
int mover[] = {-1, -1, -1, 0, 1, 1, 1, 0};
int movec[] = {-1, 0, 1, 1, 1, 0, -1, -1};
int i, j, nextr, nextc;
for (i = 0; i < DIRC; i++) {
nextr = r + mover[i];
nextc = c + movec[i];
j = 1;
/* find word from direction i */
while (word[n][j] != '\0' && RANGE(nextr, nextc)
&& sameletter(word[n][j], square[nextr][nextc])) {
j++;
nextr += mover[i];
nextc += movec[i];
}
/* find */
if (word[n][j] == '\0')
return TRUE;
}
return FALSE;
}
/* sameletter: if the letter is same
* (regardless of case)
* return TRUE
* else return FALSE */
int sameletter(char s, char t)
{
if (s == t)
return TRUE;
/* upper to lower */
if (s >= 'A' && s <= 'Z')
s = s - 'A' + 'a';
if (t >= 'A' && t <= 'Z')
t = t - 'A' + 'a';
if (s == t)
return TRUE;
return FALSE;
}
沒有留言:
張貼留言