UVaOJ_10010Where's Waldorf?

Where's Waldorf?

Given a m by n grid of letters, ($1 \leq m,n \leq 20$), 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, $1 \leqm,n \leq 50$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 ($1 \leq k \leq 20$). 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行)

第一行:第一个单词的首字母在表格中的坐标。以此类推。

单词中的字母在表格中的分布,只要(除首字母外)其他字母在首字母的八个方向中的一个方向,可以连在一起就可以。(意思就是其他字母必须在同一方向上)。

(暴力求解)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值