题目描述
给一 n×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
输入输出格式
输入格式:
第一行输入一个数 n。( 7≤n≤100 )。
第二行开始输入n×n 的字母矩阵。
输出格式:
突出显示单词的n*n 矩阵。
输入输出样例
输出样例#1:
******* ******* ******* ******* ******* ******* *******
分析:因为是要找沿着八个方向的单词“yizhong”,我们想到了要遍历而且是深度优先,沿八个方向就想着建立方向数组,这时候注意建立方向数组的时候一定要保证方向相反的两个方向下标
之和应该为7,这样可以方便我们回溯,本题采用的是染色法,题目质量不错,可以多看看。
1 #include <bits/stdc++.h> 2 using namespace std; 3 int n;char a[110][110]; 4 int bj[110][110]; 5 char book[7]="izhong"; 6 int dx,dy; 7 int nexts[8][2]={{0,1},{1,1},{1,0},{1,-1},{-1,1},{-1,0},{-1,-1},{0,-1}};//按照相反的相加和为7来设置方向 8 void ranse(int x,int y,int step,int fang){ 9 if(step>=7) return;//如果染色完毕,则返回。 10 bj[x][y]=1;//标记,在之后的染色操作中跳过 11 //cout<<233<<endl; 12 dx=x+nexts[fang][0]; 13 dy=y+nexts[fang][1]; 14 ranse(dx,dy,step+1,fang);//开始染色后就始终保持方向不变 15 } 16 void dfs(int x,int y,int step,int fang){ 17 if(x<0||x>n||y<0||y>n) return; //防止越界 18 if(step>=6){//如果step为6则说明都满足 19 ranse(x,y,0,7-fang);//注意此时传进去的是反方向 20 return ;//注意返回 21 } 22 //cout<<233<<endl; 23 dx=x+nexts[fang][0];//这里是开始方向迁移 24 dy=y+nexts[fang][1]; 25 if(a[dx][dy]!=book[step]) return ;//不满足则返回 26 //cout<<233<<endl; 27 dfs(dx,dy,step+1,fang);//沿着一个方向一直走 28 } 29 int main(){ 30 cin>>n; 31 for(int i=1;i<=n;i++){ 32 for(int j=1;j<=n;j++){ 33 cin>>a[i][j]; 34 } 35 } 36 for(int i=1;i<=n;i++){ 37 for(int j=1;j<=n;j++){ 38 if(a[i][j]=='y'){ 39 for(int fang=0;fang<8;fang++){ 40 dfs(i,j,0,fang); 41 } 42 } 43 } 44 } 45 for(int i=1;i<=n;i++){ 46 for(int j=1;j<=n;j++){ 47 if(bj[i][j]!=1) 48 a[i][j]='*'; 49 cout<<a[i][j]; 50 } 51 cout<<endl; 52 } 53 return 0; 54 }