题目描述
给一nXn的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间[color=red]可以[/color]交叉,因此有可能共用字母。输出时,将不是单词的字母用“*”代替,以突出显示单词。例如:
输入:
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)。
第二行开始输入nXn的字母矩阵。
输出格式:
突出显示单词的nXn矩阵。
输入输出样例
输入样例#1: 复制
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
输出样例#1: 复制
#include<iostream>
using namespace std;
const int maxn=100+5;
int d[8][2]={{1,1},{1,-1},{-1,1},{-1,-1},{1,0},{0,1},{-1,0},{0,-1}};
char cmp[7]={'y','i','z','h','o','n','g'} ;//用来匹配
int n;
bool mark[maxn][maxn]={0}; //图的标记
char map[maxn][maxn]; //图
void init(){
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) cin>>map[i][j];
}
void print(){
int i,j;
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)
{
if(mark[i][j])
cout<<map[i][j];
else cout<<"*";
}
cout<<endl;
}
}
inline void check(int x,int y){
int i,j,k;
for(k=0;k<8;k++){
for(i=1;i<=6;i++){
int nx=x+i*d[k][0],ny=y+i*d[k][1];
if(nx<1||nx>n||ny<1||ny>n) break; //越界
if(map[nx][ny]!=cmp[i]) break;
}
if(i==7)
for(j=0;j<=6;j++) mark[x+d[k][0]*j][y+d[k][1]*j]=1; //标记这些为真
}
}
void solve(){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(map[i][j]=='y') check(i,j);
}
int main(){
init(); //输入
solve();//解决
print();//输出
return 0;
}