Where's Waldorf?
Given a m by n grid of letters, (), and a listof words, find the location in the grid at which the word can be found.A word matches a straight, uninterrupted line of letters in the grid.A word can match the letters in the grid regardless of case (i.e. upperand lower case letters are to be treated as the same). The matchingcan be done in any of the eight directions either horizontally, verticallyor diagonally through the grid.
Input
The input begins with a single positive integer on a line by itself indicating the number of the cases following, each of them as described below. This line is followed by a blank line, and there is also a blank line between two consecutive inputs.The input begins with a pair of integers, m followed by n, in decimal notation on a single line. The next m linescontain n letters each; this is the grid of letters in which thewords of the list must be found. The letters in the grid may be inupper or lower case. Following the grid of letters, another integerk appears on a line by itself (
). The next klines of input contain the list of words to search for, one word perline. These words may contain upper and lower case letters only (nospaces, hyphens or other non-alphabetic characters).
Output
For each test case, the output must follow the description below. The outputs of two consecutive cases will be separated by a blank line.For each word in the word list, a pair of integers representing thelocation of the corresponding word in the grid must be output. Theintegers must be separated by a single space. The first integer is theline in the grid where the first letter of the given word can be found(1 represents the topmost line in the grid, and m represents thebottommost line). The second integer is the column in the grid wherethe first letter of the given word can be found (1 represents theleftmost column in the grid, and n represents the rightmost column inthe grid). If a word can be found more than once in the grid, then thelocation which is output should correspond to the uppermost occurenceof the word (i.e. the occurence which places the first letter of theword closest to the top of the grid). If two or more words areuppermost, the output should correspond to the leftmost of theseoccurences. All words can be found at least once in the grid.
Sample Input
1 8 11 abcDEFGhigg hEbkWalDork FtyAwaldORm FtsimrLqsrc byoArBeDeyv Klcbqwikomk strEBGadhrb yUiqlxcnBjf 4 Waldorf Bambi Betty Dagbert
2 5 2 3 1 2 7 8代码:
#include <cstdio>
#include <cstring>
#include <cctype>
const int MAXN = 52;
struct Point {
int x, y;
};
const Point WAY[] = { //关于这个字符的八个方向的坐标//
{-1, -1}, {-1, 0}, {-1, 1},
{ 0, -1}, { 0, 1},
{ 1, -1}, { 1, 0}, { 1, 1},
};
int n, m, k;
int grid[MAXN][MAXN];
char word[MAXN];
bool Find(int x, int y) { //从该字符的八个方向循环判断
for (int i = 0; i < 8; i++) {
bool bo = true;
int t1 = strlen(word);
for (int j = 0; j < t1; j++) { //判断输入的字母是否与当前方向上的字符相同
if (grid[x + WAY[i].x * j][y + WAY[i].y * j] != word[j]) { //如果不相同,就结束,找下一个方向
bo = false;
break;
}
}
if (bo)
return true;
}
return false;
}
int main() {
int e;
scanf("%d", &e);
while (e--) {
scanf("%d%d", &n, &m);
getchar();
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++)
grid[i][j] = tolower(getchar()); //把字符转换成小写字母(统一形式,容易比较),后放入表格中。
getchar();
}
scanf("%d", &k);
getchar();
for ( i = 0; i < k; i++) {
gets(word);
int t2=strlen(word);
for (int j = 0; j < t2; j++)
word[j] = tolower(word[j]);
bool bo = false;
for (int x = 1; x <= n; x++)
for (int y = 1; y <= m; y++) { //在n*m的方格中,调用Find()函数,根据坐标找是否相同
if (!bo && Find(x, y)) {
printf("%d %d\n", x, y);
bo = true;
}
}
}
}
printf("%s", e ? "\n" : "");
return 0;
}
思路解析:
题目要求的意思是:
第一行输入几组测试数据;
第二行输入n m,表示有n*m矩形的方格;
接下来的n行,输入字符串。。。
再输入k,表示有K个单词(word);
接下来的k行,输入单词。。。
输出:(共有K行)
第一行:第一个单词的首字母在表格中的坐标。以此类推。
单词中的字母在表格中的分布,只要(除首字母外)其他字母在首字母的八个方向中的一个方向,可以连在一起就可以。(意思就是其他字母必须在同一方向上)。