题目链接
思路:
很直接的思路,先遍历找到单词的第一个对应字母,然后再遍历该字母的8个方向,判断第二个对应字母方向,再根据该方向判断是否能够找到其他几个对应字母即可。
ac代码:
#include <bits/stdc++.h>
using namespace std;
char A[105][105]; bool vis[105][105];
int B[8][2]={0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1};
string s; int t;
void bj(int e,int f,int c,int d){
int flag=0; int a=e,b=f;
for(int i=0;i<6;i++){
a+=c; b+=d;
if(A[a][b]!=s[i+1]||a<0||a>=t||b<0||b>=t){
flag=1;
}
}
if(flag==1) return ;
else {
vis[e][f]=true;
for(int i=0;i<6;i++){
e+=c; f+=d;
vis[e][f]=true;
}
}
}
void dfs(int a,int b){
for(int i=0;i<8;i++){
int c=a+B[i][0];
int d=b+B[i][1];
if(c>=0&&c<t&&d>=0&&d<t&&A[c][d]==s[1]){
bj(a,b,B[i][0],B[i][1]);
}
}
}
int main(){
cin>>t;
for(int i=0;i<t;i++){
for(int j=0;j<t;j++){
cin>>A[i][j];
}
}
s="yizhong";
for(int i=0;i<t;i++){
for(int j=0;j<t;j++){
if(A[i][j]==s[0]){
dfs(i,j);
}
}
}
for(int i=0;i<t;i++){
for(int j=0;j<t;j++){
if(!vis[i][j]){
A[i][j]='*'; cout<<A[i][j];
}
else {
cout<<A[i][j];
}
}
cout<<endl;
}
}