[UVA10010] Where’s Waldorf?

2017年9月3日

给你一个由 m 行 n 列字母组成的方块, 让你在这个方块中找出 k 个字符串所在位置, 不区分大小写, 可以向八个方向查找, 上下左右或者四个对角. 对于每一个要查找的字符串, 输出第一次查找到时这个字符串的第一个字母在方块中的位置.

就直接根据题意模拟一下就好了, 枚举方块中的每一个位置跟每一个方向, 看看是否能匹配.

#include <bits/stdc++.h>
using namespace std;
const int N = 55;
int dx[] = {0, 0, 1, 1, 1, -1, -1, -1};
int dy[] = {1, -1, 0, 1, -1, 0, 1, -1};
char mp[N][N];
int m, n;
void search(char *str)
{
    int len = strlen(str);
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (tolower(str[0]) != tolower(mp[i][j]))
                continue;
            for (int k = 0; k < 8; k++) {
                int ok = 1;
                for (int q = 0; q < len; q++) {
                    int nx = q * dx[k] + i, ny = q * dy[k] + j;
                    if (0 <= nx && nx < m && 0 <= ny && ny < n) {
                        if (tolower(mp[nx][ny]) != tolower(str[q])) {
                            ok = 0;
                            break;
                        }
                    } else {
                        ok = 0;
                        break;
                    }
                }
                if (ok) {
                    printf("%d %d\n", i + 1, j + 1);
                    return;
                }
            }
        }
    }
}
int main()
{
    int t;
    scanf("%d", &t);
    int flag = 0;
    while (t--) {
        if (flag) {
            printf("\n");
        }
        flag = 1;
        scanf("%d %d", &m, &n);
        for (int i = 0; i < m; i++) {
            scanf("%s", mp[i]);
        }
        int k;
        scanf("%d", &k);
        while (k--) {
            char str[25];
            scanf("%s", str);
            search(str);
        }
    }
    return 0;
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注