题目描述
给一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:
*******
*******
*******
*******
*******
*******
******* 还是一道比较水的搜索的,可以通过向八个方向判断是否存在"yizhong",虽然比较长,但是主要是复制粘贴,并且可以加上一个如果当前位置到边界距离不足时直接break的剪枝,所以,我选择了披着dfs皮的模拟
上代码:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n;
char a[][],b[][],t[]={' ','y','i','z','h','o','n','g'};//先把yizhong存起来
bool flag;
void dfs(int x,int y){//各种判断各种复制粘贴,主要时注意二位数组里的下标以及剪枝
if(x->=&&y+<=n){//右上
for(int i=;i<=;i++){
if(a[x-i+][y+i-]!=t[i]){
flag=;
}
}
if(flag==){
for(int i=;i<=;i++){
b[x-i+][y+i-]=t[i];
}
}
flag=;
}
if(y+<=n){//右
for(int i=;i<=;i++){
if(a[x][y+i-]!=t[i]){
flag=;
}
}
if(flag==){
for(int i=;i<=;i++){
b[x][y+i-]=t[i];
}
}
flag=;
}
if(x+<=n&&y+<=n){//右下
for(int i=;i<=;i++){
if(a[x+i-][y+i-]!=t[i]){
flag=;
}
}
if(flag==){
for(int i=;i<=;i++){
b[x+i-][y+i-]=t[i];
}
}
flag=;
} if(x+<=n){//下
for(int i=;i<=;i++){
if(a[x+i-][y]!=t[i]){
flag=;
}
}
if(flag==){
for(int i=;i<=;i++){
b[x+i-][y]=t[i];
}
}
flag=;
}
if(x+<=n&&y->=){//左下
for(int i=;i<=;i++){
if(a[x+i-][y-i+]!=t[i]){
flag=;
}
}
if(flag==){
for(int i=;i<=;i++){
b[x+i-][y-i+]=t[i];
}
}
flag=;
}
if(y->=){//左
for(int i=;i<=;i++){
if(a[x][y-i+]!=t[i]){
flag=;
}
}
if(flag==){
for(int i=;i<=;i++){
b[x][y-i+]=t[i];
}
}
flag=;
}
if(x->=&&y->=){//左上
for(int i=;i<=;i++){
if(a[x-i+][y-i+]!=t[i]){
flag=;
}
}
if(flag==){
for(int i=;i<=;i++){
b[x+i-][y-i+]=t[i];
}
}
flag=;
}
if(x->=){//上
for(int i=;i<=;i++){
if(a[x-i+][y]!=t[i]){
flag=;
}
}
if(flag==){
for(int i=;i<=;i++){
b[x-i+][y]=t[i];
}
}
flag=;
}
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
b[i][j]='*';
}
for(int i=;i<=n;i++){
scanf("%s",a[i]+);
}
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
dfs(i,j);//其实是模拟哦
}
}
for(int i=;i<=n;i++,puts(""))
for(int j=;j<=n;j++){
printf("%c",b[i][j]);
}
return ;
}