题目描述
给一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矩阵。
输入输出样例
输入 #1复制
7 aaaaaaa aaaaaaa aaaaaaa aaaaaaa aaaaaaa aaaaaaa aaaaaaa
输出 #1复制
******* ******* ******* ******* ******* ******* *******
输入 #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
#include<iostream>
using namespace std;
int c[10000][2], d = 0;
int x[9] = { 0,1,0,1,-1,0,-1,1,-1 };
int y[9] = { 0,0,1,1,0,-1,-1,-1,1 };//八个方位
char a[103][103], b, k[9] = " yizhong";
bool s[102][102];
bool dfs(int i, int j, int m, int n, int next) {//i,j为该点位置,m,n为搜索的方向,next为yizhong第几个字符
if (next >= 8) {//说明查找完了
s[i][j] = 1;
return 1;
}
if (a[i + m][j + n] == k[next])//如果此方位的下一个字母满足
if (dfs(i + m, j + n, m, n, next + 1)) {//继续搜索到底。如果最终能满足
s[i][j] = 1;//那么染色
return 1;
}
return 0;
}
int main() {
int n, i, j, o;
cin >> n;
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
cin >> b;
if (b == 'y') {//先记录y的位置,每次查找都从y开始
c[++d][0] = i;
c[d][1] = j;
}
a[i][j] = b;
}
}
while (d) {//d为y的个数
i = c[d][0];
j = c[d][1];
for (o = 1; o <= 8; o++) {//从y的八个方位开始找
if (a[i + x[o]][j + y[o]] == 'i')//如果某方位有i
if (dfs(i + x[o], j + y[o], x[o], y[o], 3))//那么便从此方位继续搜索第三个乃至于最后的字符
s[i][j] = 1;//搜索成功即染色
}
d--;
}
for (i = 1; i <= n; i++) {
for (j = 1; j <= n; j++) {
if (s[i][j])cout << a[i][j];//染色过的便原样输出
else cout << "*";
}
cout << endl;
}
return 0;
}