题目描述
给一n \times nn×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
输入输出格式
输入格式:
第一行输入一个数nn。(7 \le n \le 1007≤n≤100)。
第二行开始输入n \times nn×n的字母矩阵。
输出格式:
突出显示单词的n \times nn×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 <bits/stdc++.h>
using namespace std;
struct node//记录路径的坐标
{
int x,y;
}no[10];
int n,visited[110][110];
char words[110][110],s[]={"yizhong"};
int move[][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};//八个方向
void dfs(int x,int y,node n[],int dir,int cnt)
{
if(cnt==7)//与yizhong 相等则把路径记录下来
{
for(int i=0;i<7;i++)
{
visited[no[i].x][no[i].y]=1;
}
return;
}
if(words[x][y]==s[cnt])
{
no[cnt].x=x;
no[cnt].y=y;
int nowx=x+move[dir][0];//向八个方向搜索
int nowy=y+move[dir][1];
dfs(nowx,nowy,no,dir,cnt+1);
}
}
int main()
{
scanf("%d",&n);
memset(visited,0,sizeof(visited));
for(int i=0;i<n;i++)
{
scanf("%s",words[i]);
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(words[i][j]=='y')
{
for(int k=0;k<8;k++)
{
int nowx=i+move[k][0];
int nowy=j+move[k][1];
if(words[nowx][nowy]=='i')//找到yi的一个方向
{
dfs(i,j,no,k,0);//按这个方向搜索
}
}
}
}
}
for(int i=0;i<n;i++)//输出结果
{
for(int j=0;j<n;j++)
{
if(visited[i][j]) printf("%c",words[i][j]);
else printf("*");
}
printf("\n");
}
return 0;
}