题目描述
给一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<iostream> #include<string> #include<algorithm> using namespace std; const int inf=105; int a[inf][inf],n; char str[inf][inf]; string s="yyizhong"; struct node{ int x,y; }c[inf]; void dfs(int x,int y,int step,int k,int k1) { if(x>n||x<1||y>n||y<1) return ; if(step==8) { for(int i=1;i<8;i++) { a[c[i].x][c[i].y]=1; } return ; } int x2=x+k; int y2=y+k1; if(str[x2][y2]==s[step]) { c[step].x=x2; c[step].y=y2; dfs(x2,y2,step+1,k,k1); } } int main() { int x1[]={1,-1,0,0,-1,-1,1,1}; int y1[]={0,0,-1,1,-1,1,-1,1}; cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { cin>>str[i][j]; } fill(a[0],a[0]+inf*inf,0); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(str[i][j]=='y') { c[1].x=i; c[1].y=j; for(int m=0;m<8;m++) { int x2=i+x1[m]; int y2=j+y1[m]; if(str[x2][y2]==s[2]) { c[2].x=x2; c[2].y=y2; dfs(x2,y2,3,x1[m],y1[m]); } } } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(a[i][j]==1) cout<<str[i][j]; else cout<<'*'; } cout<<endl; } return 0; }
还以为会超时,没想到过了