题目描述
给一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
分析:dfs搜索,稍微细心一些即可通过
代码如下:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<map>
using namespace std;
int n;
char c[130][120];
bool vis[130][120][10];//第三维表示方向
map<char,char>mp;
int dx[]={0,1,1,1,0,0,-1,-1,-1};
int dy[]={0,1,-1,0,1,-1,1,-1,0};
bool check(int x,int y){
if(x<1||x>n||y<1||y>n)
return false;
return true;
}
bool dfs(int x,int y,int k){//x,y表示位置,k表示方向
int nx=x+dx[k];
int ny=y+dy[k];
char p1=c[x][y];//t1
char p2=c[nx][ny];//要搜索的下一个方向上的字符
if(p1=='n'&&p2=='g'){//如果搜索成功,标记,并返回1
vis[nx][ny][k]=1;
return 1;
}
if(mp[p1]==p2){//如果满足下一步条件,继续搜索
if(dfs(nx,ny,k)){
vis[nx][ny][k]=1;
return 1;
}
}
vis[nx][ny][k]=0;
return 0;
}
int main()
{
mp['y']='i';mp['i']='z';mp['z']='h';mp['h']='o';mp['o']='n';mp['n']='g';
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>c[i][j];
}
}
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(c[i][j]=='y'){
char t1=c[i][j];//t1==y
int x=i;
int y=j;
for(int k=1;k<=8;k++){
int nx=x+dx[k];
int ny=y+dy[k];
char t2=c[nx][ny];//任意字符
if(check(nx,ny)&&mp[t1]==t2){//如果没超边界&&下一个字符核对成功
if(dfs(nx,ny,k)){
vis[x][y][k]=1;
vis[nx][ny][k]=1;
}
}
}
}
}
}
int flag=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=8;k++){
if(vis[i][j][k]){
cout<<c[i][j];
flag=1;
break;
}
}
if(flag==1)flag=0;
else cout<<'*';
}
cout<<endl;
}
return 0;
}