题目描述
给一 n×nn \times nn×n 的字母方阵,内可能蕴含多个“yizhong
”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 888 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用*
代替,以突出显示单词。例如:
输入:
8 输出:
qyizhong *yizhong
gydthkjy gy******
nwidghji n*i*****
orbzsfgz o**z****
hhgrhwth h***h***
zzzzzozo z****o**
iwdfrgng i*****n*
yyyygggg y******g
输入输出格式
输入格式:第一行输入一个数 nnn 。( 7≤n≤1007 \le n \le 1007≤n≤100 )。
第二行开始输入 n×nn \times nn×n 的字母矩阵。
输出格式:突出显示单词的 n×nn \times n
n×n 矩阵
简单的深度优先搜索,由每一个y开始向单一方向搜索所给地图,维护辅助数组,最后根据辅助数组输出‘*’或者“yizhong”即可:
#include<stdio.h>
#include<string.h>
char map[2][102][102],tem[] = "yizhong";
int overWrite,n,moveMetho[2][8] = {{1,1,1,-1,-1,-1,0,0},{1,0,-1,1,0,-1,1,-1}};
void shell();
void content(int x,int y,int point,int cur);
int main() {
scanf("%d",&n);
memset(map,0,sizeof(map));
for(int i = 1; i <= n; i++)
scanf("%s",&map[0][i][1]);
shell();
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++)
if(map[1][i][j] == 1) printf("%c",map[0][i][j]);
else printf("*");
printf("\n");
}
return 0;
}
void shell() {
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(map[0][i][j] == 'y')
for(int k = 0; k < 8; k++) {
overWrite = 0;
content(i,j,k,0);
}
}
void content(int x,int y,int point,int cur){
if (cur == 7) {
overWrite = 1;
return ;
} else if (map[0][x][y] != tem[cur]) return ;
content(x + moveMetho[0][point],y + moveMetho[1][point],point,cur + 1);
if (overWrite) map[1][x][y] = 1;
}