题目描述
给一 n∗n n ∗ n 的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 88 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用*代替,以突出显示单词。例如:
输入: 输出:
qyizhong *yizhong
gydthkjy gy******
nwidghji n*i*****
orbzsfgz o**z****
hhgrhwth h***h***
zzzzzozo z****o**
iwdfrgng i*****n*
yyyygggg y******g
输入输出格式
输入格式:
第一行输入一个数 n n ( 7≤n≤100 7 ≤ n ≤ 100 )
第二行开始输入 n∗n n ∗ n 的字母矩阵。
输出格式:
突出显示单词的 n∗n n ∗ n 矩阵。
解题思路:
0)简化一下题目的条件,对于每个以’y’开头的字符串而言,其搜索方向只有8邻域
1)利用结构体记录一下成功连接字符串时的路径,然后给路径上的点做上标记
2)注意在搜索是cnt作为局部变量和全局变量的区别
#include
#include
#include
#include
using namespace std;
char map[105][105];
int mark[105][105];
int n,k=0;
int dir[][2]={{-1,0},{-1,1},{-1,-1},{0,1},{0,-1},{1,0},{1,-1},{1,1}};//8个不同的搜索方向
char str[]={'y','i','z','h','o','n','g'};
struct loc{
int x,y;
}c[10];//记录路径
void solve(int x,int y,int k,int cnt){//当前点的x,y坐标,8个方向中的特定方向,当前已经连接的字母个数
if(cnt==7){//结束条件
for(int i=0;i<7;i++){
mark[c[i].x][c[i].y]=1;
}
return;
}
int nx=x+dir[k][0];
int ny=y+dir[k][1];
if(nx>=0&&nx<=n-1&&ny>=0&&ny<=n-1){
if(map[nx][ny]==str[cnt]){
c[cnt].x=nx;
c[cnt].y=ny;
solve(nx,ny,k,cnt+1);
}
}
}
int main(int argc, char** argv) {
scanf("%d",&n);
for(int i=0;iscanf("%s",map[i]);
}
for(int i=0;ifor(int j=0;jif(map[i][j]=='y'){
c[0].x=i,c[0].y=j;
for(int k=0;k<=7;k++)
solve(i,j,k,1);
}
}
}
for(int i=0;ifor(int j=0;jif(mark[i][j])
printf("%c",map[i][j]);
else
printf("*");
}
printf("\n");
}
return 0;
}