思路:
此题显然是搜索,而且自带方向,我们只需从他所要求的单词的第一个字母开始。先找到‘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; }