题目描述
给一n×n的字母方阵,内可能蕴含多个“yizhong
”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 88 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用*
代替,以突出显示单词。例如:
输入格式
第一行输入一个数n。(7≤n≤1007≤n≤100)。
第二行开始输入n×n的字母矩阵。
输出格式
突出显示单词的n×nn×n矩阵。
输入输出样例
#include <bits/stdc++.h>
using namespace std;
int n,f[200][200];
char mat[200][200];
char p[]={'y','i','z','h','o','n','g'};
struct point{
int x,y;
};
int ax[]={-1,-1,0,1,1,1,0,-1},ay[]={0,1,1,1,0,-1,-1,-1};
stack<point>sta;
bool match(char c){
for(int i=0;i<7;i++)
if(p[i]==c)return true;
return false;
}
bool dfs(int x,int y,int c,int d){
if(mat[x][y]!=p[c]) return false;
else if(mat[x][y]==p[c]&&c==6){
f[x][y]=1;
return true;
}
if(dfs(x+ax[d], y+ay[d], c+1,d)){
f[x][y]=1;
return true;
}
return false;
}
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++){
string s ;
cin>>s;
for(int j=1;j<=n;j++){
mat[i][j]=s[j-1];
if(mat[i][j]=='y')
sta.push({i,j});
if(!match(mat[i][j]))mat[i][j]='*';
}
}
while (!sta.empty()) {
point ps = sta.top();
sta.pop();
for(int i=0;i<8;i++)dfs(ps.x,ps.y,0,i);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
if(mat[i][j]!='*'&&f[i][j]==1)printf("%c",mat[i][j]);
else printf("*");
printf("\n");
}
return 0;
}