[算法练习] UVA-10010-Where's Waldorf?
UVA Online Judge 题目10010 Where's Waldorf? Waldorf在哪?
问题描述:
给出一个m行n列的字符矩阵(),和一个单词列表,在矩阵上匹配每个单词。在矩阵上匹配单词包含八个方向(上、下、左、右、左上、左下、右上、右下),单词匹配成功后输出第一个字符的坐标。
输入格式:
第一行是一个整数,表示案例的个数。第二行是一个空行,每个案例的输入前都有一个空行。
第三行是第一个案例的m和n,,表示接下来的矩阵有m行n列。接下来m行是矩阵的数据。
矩阵数据输入完之后是一个整数,表示该次案例需要匹配的单词个数k(),接下来k行既是k个单词。
输出格式:
针对每一个需要搜索的单词匹配成功后输出首字母的坐标,同一列有多个位置匹配成功则输出最靠上方的,同一行有多个位置匹配成功的则输出最靠左的一个(也就是说:我们只需要按列循环匹配,列内从小到大匹配即可)。
注意:每个例子中间需要间隔一行,最后一个例子后面没有空行。
示例输入:
1 8 11 abcDEFGhigg hEbkWalDork FtyAwaldORm FtsimrLqsrc byoArBeDeyv Klcbqwikomk strEBGadhrb yUiqlxcnBjf 4 Waldorf Bambi Betty Dagbert
示例输出:
2 5 2 3 1 2 7 8
代码:(局部变量覆盖上一层变量WA了一次。。)
1 /* 2 Problem : UVA Online Judge - 10010 Where's Waldorf? 3 Date:2014-04-03 4 Author:Leroy 5 */ 6 7 #include <stdio.h> 8 #include <string.h> 9 #include <ctype.h> 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 }