给一
n
×
n
n \times n
n×n 的字母方阵,内可能蕴含多个 yizhong
单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着
8
8
8 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用 *
代替,以突出显示单词。例如:
输入:
8 输出:
qyizhong *yizhong
gydthkjy gy******
nwidghji n*i*****
orbzsfgz o**z****
hhgrhwth h***h***
zzzzzozo z****o**
iwdfrgng i*****n*
yyyygggg y******g
第一行输入一个数 n n n。( 7 ≤ n ≤ 100 7 \le n \le 100 7≤n≤100)。
第二行开始输入 n × n n \times n n×n 的字母矩阵。
突出显示单词的 n × n n \times n n×n 矩阵。
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
*******
*******
*******
*******
*******
*******
*******
8
qyizhong
gydthkjy
nwidghji
orbzsfgz
hhgrhwth
zzzzzozo
iwdfrgng
yyyygggg
*yizhong
gy******
n*i*****
o**z****
h***h***
z****o**
i*****n*
y******g
#include
using namespace std;
int dx[] = {-1, -1, 0, 1, 1, 1, 0, -1};
int dy[] = {0, 1, 1, 1, 0, -1, -1, -1};
int n;
char a[105][105];
int vis[105][105];//标记染色
vector<pair<int, int>> v;//保存路径
string s = "yizhong";
//direct为当前这条路的方向
void dfs(int u, int x, int y, int direct) {
//别惯性u==7,因为u=7时候,可能x,y已越界,下一趟dfs都没进来
if (u == 6 && a[x][y] == s[u]) {
//搜够了8个字母且都匹配,染色vis
for (int i = 0; i < v.size(); i++) {
int xx = v[i].first, yy = v[i].second;
vis[xx][yy] = 1;
}
}
//不匹配直接return,自然到不了u=6,自然不会染色错误
if (a[x][y] != s[u]) {
return;
}
int xx = x + dx[direct];
int yy = y + dy[direct];
if (xx >= 0 && yy >= 0 && xx < n && yy < n) {
//把这条路的路径存起来,方便最后走完这条路进行染色
v.push_back({xx, yy});
dfs(u + 1, xx, yy, direct);
}
}
int main() {
cin >> n;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cin >> a[i][j];
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (a[i][j] == 'y') {
//起点开始向八个方向搜,一路向前不改变方向,而不是每个点都要八个方向dfs(单调方向,所以就不能在dfs函数中,每经过一点就8个方向是错的)
for (int k = 0; k < 8; k++) {
v.push_back({i, j});
dfs(0, i, j, k);
v.clear();
}
}
}
}
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
if (vis[i][j])
cout << a[i][j];
else
cout << "*";
}
cout << endl;
}
return 0;
}