题目如下:
题目描述
给一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 \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 <bits/stdc++.h>
using namespace std;
int n;
//用户输入的方阵数据,输出结果,用于参考的基准
char square[110][110],res[110][110],stand[]="yizhong";
//可供搜索的八个方向
int dire[][2]={{0,1},{0,-1},{1,0},{-1,0},{-1,-1},{-1,1},{1,1},{1,-1}};
//正确答案所在的坐标
struct Node{
int x;
int y;
}node[110];
//sx:用户输入的字母方阵(square)中的行 sy:square中的列 node:输出方阵res所在的行列 k:前两个字母所确定的方向 cur:以达到的数字下标
void dfs(int sx,int sy,Node node[],int k,int cur){
if(cur==7){
for(int i=0;i<7;i++){
res[node[i].x][node[i].y]=1;
}
}else{
int x=sx+dire[k][0];
int y=sy+dire[k][1];
//搜索到基准的最后一个字母或方阵当前字母等于基准下一个字母时,将当前坐标存储进node中保存
if(cur==6||square[x][y]==stand[cur+1]){
node[cur].x=sx;
node[cur].y=sy;
dfs(x,y,node,k,cur+1);
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>square[i][j];
}
}
memset(res,0,sizeof(res));
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
//当找到第一个字母和第二个字母时,方向就确定了,开始搜索
if(square[i][j]=='y'){
for(int k=0;k<8;k++){
int x=i+dire[k][0];
int y=j+dire[k][1];
if(square[x][y]=='i'){
dfs(i,j,node,k,0);
}
}
}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(res[i][j])cout<<square[i][j];
else cout<<"*";
}
cout<<endl;
}
return 0;
}