题目描述
给一 n×n 的字母方阵,内可能蕴含多个 yizhong 单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 88 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用 * 代替,以突出显示单词。例如:
输入: 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)。
第二行开始输入 n×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<iostream> #include<cstring> using namespace std; char a[110][110]; //字符数组 int vis[110][110] = { 0 }; //标记 int n; int xx[] = { 1, 1, 1, 0, 0,-1,-1,-1 }; int yy[] = { 1, 0,-1, 1,-1, 1, 0,-1 }; string yz = "yizhong"; void dfs(int x, int y) { for (int i = 0; i < 8; i++) { int flag = 1; for (int j = 0; j < 7; j++) { int dx = x + j * xx[i]; int dy = y + j * yy[i]; if (dx < 1 || dx > n || dy < 1 || dy > n || yz [j] != a[dx][dy]) { flag = 0; break; } } if (flag == 1) { for (int j = 0; j < 7; j++) { int dx = x + j * xx[i]; int dy = y + j * yy[i]; vis[dx][dy] = 1; } } } } int main() { //输入 cin >> n; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cin >> a[i][j]; } } //找到第一个字母“y” for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (a[i][j] == 'y') { dfs(i, j); } } } //输出 for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (vis[i][j] == 1) { cout << a[i][j]; } else { cout << "*"; } } cout << endl; } return 0; }