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;
}