uvaoj10010

来源:互联网 发布:steam充值卡 淘宝 编辑:程序博客网 时间:2024/04/30 04:03

在一个由字母组成的网格中,寻找单词。

单词无论大小写,但必须是在一条直线上,可以是水平、竖直或者是斜对角线的。

如果单词多次出现,仅输出最上面方,然后最靠最左的单词的首字母位置。

 

枚举每个单词的首字母位置,向八个方向检查单词是否出现即可。

 

 

 

 

 

 

 

 

// UVaOJ 10010
// Where's Waldorf?
// by A Code Rabbit

#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);

int main() {
    int tot_case;
    scanf("%d", &tot_case);
    while (tot_case--) {
        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 (int i = 0; i < k; i++) {
            gets(word);
            for (int j = 0; j < strlen(word); j++)
                word[j] = tolower(word[j]);
            bool bo = false;
            for (int x = 1; x <= n; x++)
                for (int y = 1; y <= m; y++) {
                    if (!bo && Find(x, y)) {
                        printf("%d %d\n", x, y);
                        bo = true;
                    }
                }
        }
        printf("%s", tot_case ? "\n" : "");
    }

    return 0;
}

bool Find(int x, int y) {
    for (int i = 0; i < 8; i++) {
        bool bo = true;
        for (int j = 0; j < strlen(word); j++) {
            if (grid[x + WAY[i].x * j][y + WAY[i].y * j] != word[j]) {
                bo = false;
                break;
            }
        }
        if (bo)
            return true;
    }
    return false;
}