思路:
此题显然是搜索,而且自带方向,我们只需从他所要求的单词的第一个字母开始。先找到‘y’,从‘y’向周围8个方向搜索,如果某个方向满足条件,就依这个方向往下搜索,直到把所有的字母找完。

#include <bits/stdc++.h>

using namespace std;

char a[7]={'y','i','z','h','o','n','g'};
char s[101][101];
int f[101][101];
int p[10],q[10];//记录点坐标
int dx[8]={0, 0, 1, 1, 1,-1,-1,-1};
int dy[8]={1,-1,-1, 0, 1,-1, 1, 0};//搜索的方向
int n;

void dfs(int x,int y,int z,int t){
    if(x<0||x>=n||y<0||y>=n||z>6)return;//如果越界或者单词长度超了就结束
    if(s[x][y]!=a[z])return;//如果对应的字母不符合就结束
    p[z]=x,q[z]=y;//记录当前点的坐标
    if(z==6){
        for(int i=0;i<7;i++){
            f[p[i]][q[i]]=1;
        }
        return ;
    }
    dfs(x+dx[t],y+dy[t],z+1,t);
}

int main()
{

    cin>>n;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cin>>s[i][j];
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(s[i][j]=='y'){
                for(int k=0;k<8;k++){
                    dfs(i,j,0,k);
                }
            }
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(f[i][j])cout<<s[i][j];
            else cout<<'*';
        }
        cout<<endl;
    }
    return 0;
}