题目描述
给一 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:
7aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
输出样例#1:
************************************************* 分析:因为是要找沿着八个方向的单词“yizhong”,我们想到了要遍历而且是深度优先,沿八个方向就想着建立方向数组,这时候注意建立方向数组的时候一定要保证方向相反的两个方向下标 之和应该为7,这样可以方便我们回溯,本题采用的是染色法,题目质量不错,可以多看看。
1 #include2 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< 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< >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<