UVA Online Judge 题目10010 Where's Waldorf? Waldorf在哪?
问题描述:
给出一个m行n列的字符矩阵(),和一个单词列表,在矩阵上匹配每个单词。在矩阵上匹配单词包含八个方向(上、下、左、右、左上、左下、右上、右下),单词匹配成功后输出第一个字符的坐标。
输入格式:
第一行是一个整数,表示案例的个数。第二行是一个空行,每个案例的输入前都有一个空行。
第三行是第一个案例的m和n,,表示接下来的矩阵有m行n列。接下来m行是矩阵的数据。
矩阵数据输入完之后是一个整数,表示该次案例需要匹配的单词个数k(),接下来k行既是k个单词。
输出格式:
针对每一个需要搜索的单词匹配成功后输出首字母的坐标,同一列有多个位置匹配成功则输出最靠上方的,同一行有多个位置匹配成功的则输出最靠左的一个(也就是说:我们只需要按列循环匹配,列内从小到大匹配即可)。
注意:每个例子中间需要间隔一行,最后一个例子后面没有空行。
示例输入:
18 11abcDEFGhigghEbkWalDorkFtyAwaldORmFtsimrLqsrcbyoArBeDeyvKlcbqwikomkstrEBGadhrbyUiqlxcnBjf4WaldorfBambiBettyDagbert
示例输出:
2 52 31 27 8
代码:(局部变量覆盖上一层变量WA了一次。。)
1 /* 2 Problem : UVA Online Judge - 10010 Where's Waldorf? 3 Date:2014-04-03 4 Author:Leroy 5 */ 6 7 #include8 #include 9 #include 10 11 char grid[51][51];12 13 void findWord(int m, int n, char* str)14 {15 int len = strlen(str);16 int x, y;17 18 for (x = 0; x < m; x++)19 {20 for (y = 0; y < n; y++)21 {22 if (grid[x][y] == str[0])23 {24 for (int ix = -1; ix <= 1; ix++)25 {26 for (int iy = -1; iy <= 1; iy++)27 {28 if (!(ix == 0 && iy == 0))29 {30 int c = 1;31 for (; c < len; c++)32 {33 int cx = x + ix*c;34 int cy = y + iy*c;35 if (cx<0 || cy<0 || cx>(m-1) || cy>(n-1))36 break;37 if (grid[cx][cy] != str[c])38 break;39 }40 if (c == len)41 {42 printf("%d %d\n", x+1, y+1);43 return;44 }45 }46 }47 }48 }49 }50 }51 52 }53 54 int main(){55 int num;56 scanf("%d", &num);57 58 for (int i = 0; i < num; i++)59 {60 int m, n;61 scanf("%d %d", &m, &n);62 for (int j = 0; j < m; j++)63 {64 scanf("%s", grid[j]);65 for (int k = 0; k < n; k++)66 {67 grid[j][k] = toupper(grid[j][k]);68 }69 }70 71 int wn;72 char word[51];73 scanf("%d", &wn);74 for (int j = 0; j < wn; j++)75 {76 scanf("%s", word);77 int k = 0;78 while (word[k] != '\0')79 {80 word[k] = toupper(word[k]);81 k++;82 }83 findWord(m, n, word);84 }85 86 if (i != num - 1)87 printf("\n");88 }89 90 return 0;91 }