[算法练习] UVA-10010-Where's Waldorf?

UVA Online Judge 题目10010 Where's Waldorf?  Waldorf在哪?

问题描述:

  给出一个m行n列的字符矩阵($1 leq m,n leq 20$),和一个单词列表,在矩阵上匹配每个单词。在矩阵上匹配单词包含八个方向(上、下、左、右、左上、左下、右上、右下),单词匹配成功后输出第一个字符的坐标。

输入格式:

  第一行是一个整数,表示案例的个数。第二行是一个空行,每个案例的输入前都有一个空行。

  第三行是第一个案例的m和n,$1 leq m,n leq 20$,表示接下来的矩阵有m行n列。接下来m行是矩阵的数据。

  矩阵数据输入完之后是一个整数,表示该次案例需要匹配的单词个数k($1 leq k leq 20$),接下来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
", 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] != '')
79             {
80                 word[k] = toupper(word[k]);
81                 k++;
82             }
83             findWord(m, n, word);
84         }
85 
86         if (i != num - 1)
87             printf("
");
88     }
89 
90     return 0;
91 }
原文地址:https://www.cnblogs.com/Leroy1245/p/Uva_Problem_10010.html