题目描述
给一nXn的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用“*”代替,以突出显示单词。例如:
输入:
8 输出:
qyizhong yizhong
gydthkjy gy*****
nwidghji ni*****
orbzsfgz oz***
hhgrhwth hh***
zzzzzozo zo**
iwdfrgng i*****n
yyyygggg y****g
输入输出格式
输入格式:
第一行输入一个数n。(7<=n<=100)。
第二行开始输入nXn的字母矩阵。
输出格式:
突出显示单词的nXn矩阵。
输入输出样例
输入样例#1:
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
输出样例#1:
————————————————
思路: 深搜
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn= 100+10;
int n;
char mp[maxn][maxn];
bool vis[maxn][maxn];
int xx[]={1,1,1,0,0,-1,-1,-1};
int yy[]={1,0,-1,1,-1,1,0,1};
string yz="yizhong";
void dfs(int x,int y){
for(int i=0;i<8;i++){
int flag1=1;
for(int j=0;j<7;j++){
int dx=x+j*xx[i];
int dy=y+j*yy[i];
if(dx<0||dx>n||dy<0||dy>n||yz[j]!=mp[dx][dy]){
flag1=0;
break;
}
}
if(flag1)
{
for(int j=0;j<7;j++){
int dx=x+j*xx[i];
int dy=y+j*yy[i];
vis[dx][dy]=1;
}
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>mp[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(mp[i][j]=='y'){
dfs(i,j);
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(!vis[i][j])
cout<<"*";
else
cout<<mp[i][j];
}
cout<<endl;
}
return 0;
}