DFS P1101 单词方阵

DFS P1101 单词方阵

题目描述

给一 \(n \times n\) 的字母方阵,内可能蕴含多个 yizhong 单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 \(8\) 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用 * 代替,以突出显示单词。

输入格式

第一行输入一个数 \(n\)\((7 \le n \le 100)\)

第二行开始输入 \(n \times n\) 的字母矩阵。

输出格式

突出显示单词的 \(n \times n\) 矩阵。

输入输出样例 #1

输入 #1

7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa

输出 #1

*******
*******
*******
*******
*******
*******
*******

输入输出样例 #2

输入 #2

8
qyizhong
gydthkjy
nwidghji
orbzsfgz
hhgrhwth
zzzzzozo
iwdfrgng
yyyygggg

输出 #2

*yizhong
gy******
n*i*****
o**z****
h***h***
z****o**
i*****n*
y******g

思路

DFS染色问题。

遍历原方阵,如果遇到目标串 yizhong 的第一个字母 y ,开始以八个不同方向 \(k\) 开始遍历,\(k\) 是方向数组下标。

在DFS函数里先按单一方向 \(k\) 依次匹配目标串,如果不匹配就跳出。

如果完全匹配,就从字母 y 开始依次染色。

最后染过色的输出相应字母,没染色的输出 *

代码

#include <bits/stdc++.h>
using namespace std;
string s = "yizhong";
int n;
int vis[105][105];
char mp[105][105],ans[105][105];
int dx[] = {-1,-1,-1,0,0,1,1,1}, dy[] = {1,-1,0,1,-1,1,-1,0};
map<char,char> m;
int cnt;

void dfs(int x, int y, int d)// d是方向
{
    int a = x, b = y;
    for (int i = 0; i < 7; i++) {
        if (s[i] != mp[a][b]) return;
        // 成功继续向前
        a += dx[d];
        b += dy[d];
    }
    // 染色
    for (int i = 0; i < 7; i++) {
        vis[x][y] = 1;
        x += dx[d];
        y += dy[d];
    }

}

int main()
{
    cin.tie(0) -> sync_with_stdio(0);
    cin >> n;
    for (int i = 0; i < 6; i++) m[s[i]] = s[i + 1];
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            cin >> mp[i][j];
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++) {
            if (mp[i][j] == 'y')
                for (int k = 0; k < 8; k++) dfs(i, j, k);
        }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (vis[i][j]) cout << mp[i][j];
            else cout << '*';
        }
        cout << endl;
    }
    return 0;
}
posted @ 2025-02-20 21:04  AKgrid  阅读(25)  评论(0)    收藏  举报