Luogu P1101 单词方阵

明明是一道水题,我还找不出 bug 来。。。原本在 DFS 途中记录单词串,只好使用笨方法,在结尾加一个 for 记录单词串。终于过了。

思路:枚举图中每一个点进行 DFS,途中判断访问的点是否为连续元素(“yizhong”字符串中连续),如果不是返回;进行下一层 DFS,如果返回值 True 则直接层层返回 True,强行退出。

 1 /* P1101 单词方阵
 2  * Au: GG
 3  */
 4 #include <cstdio>
 5 #include <cstdlib>
 6 #include <cstring>
 7 #include <cmath>
 8 #include <ctime>
 9 #include <iostream>
10 #include <algorithm>
11 using namespace std;
12 const int N = 103;
13 int n, dir[8][2] = {
14     {-1, -1}, {-1, 0}, {-1, 1}, {0, -1},
15     {0, 1}, {1, -1}, {1, 0}, {1, 1}
16 };
17 char g[N][N], str[] = "yizhong"; // 强行空出 str[0]
18 bool v[N][N];
19 
20 inline char read() {
21     char c = getchar();
22     while(!isalpha(c)) c = getchar();
23     return c;
24 }
25 
26 bool dfs(int x, int y, int d, int cnt) {
27     if (g[x][y] != str[cnt]) return false;
28     if (cnt == 7) {
29         while (cnt--) {
30             v[x][y] = true;
31             x -= dir[d][0]; y -= dir[d][1];
32         }
33         return true;
34     }
35     int xx = x + dir[d][0], yy = y + dir[d][1];
36     if (1 <= xx && xx <= n && 1 <= yy && yy <= n) 
37         if (dfs(xx, yy, d, cnt + 1)) return true;
38 }
39 
40 int main() {
41     // freopen("p1101.in", "r", stdin);
42     scanf("%d", &n);
43     for (int i = 1; i <= n; i++)
44         for (int j = 1; j <= n; j++)
45             g[i][j] = read();
46     for (int i = 1; i <= n; i++)
47         for (int j = 1; j <= n; j++) 
48             for (int k = 0; k < 8; k++)
49                 dfs(i, j, k, 1);
50     for (int i = 1; i <= n; i++) {
51         for (int j = 1; j <= n; j++) {
52             if (v[i][j]) putchar(g[i][j]);
53             else putchar('*');
54         }
55         putchar('
');
56     }
57     return 0;
58 }

题面中的样例数据(与样例数据答案分离):

8
qyizhong
gydthkjy
nwidghji
orbzsfgz
hhgrhwth
zzzzzozo
iwdfrgng
yyyygggg

题面:


Luogu P1101 单词方阵

题目描述

给一nXn的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间[color=red]可以[/color]交叉,因此有可能共用字母。输出时,将不是单词的字母用“*”代替,以突出显示单词。例如:

输入:
    8                     输出:
    qyizhong              *yizhong
    gydthkjy              gy******
    nwidghji              n*i*****
    orbzsfgz              o**z****
    hhgrhwth              h***h***
    zzzzzozo              z****o**
    iwdfrgng              i*****n*
    yyyygggg              y******g

输入输出格式

输入格式:

第一行输入一个数n。(7<=n<=100)。

第二行开始输入nXn的字母矩阵。

输出格式:

突出显示单词的nXn矩阵。

输入输出样例

输入样例#1:
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
输出样例#1:
*******
*******
*******
*******
*******
*******
*******

Post author 作者: Grey
Copyright Notice 版权说明: Except where otherwise noted, all content of this blog is licensed under a CC BY-NC-SA 4.0 International license. 除非另有说明,本博客上的所有文章均受 知识共享署名 - 非商业性使用 - 相同方式共享 4.0 国际许可协议 保护。
原文地址:https://www.cnblogs.com/greyqz/p/7231371.html