DFS P1101 单词方阵

DFS P1101 单词方阵

题目描述

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

输入格式

第一行输入一个数 n(7n100)

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

输出格式

突出显示单词的 n×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 @   AKgrid  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示