版权声明:转载请注明出处 https://blog.csdn.net/qq_41431457/article/details/88742303
题目描述
给一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
输入输出格式
输入格式:
第一行输入一个数nn。(7 \le n \le 1007≤n≤100)。
第二行开始输入n \times nn×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>
#define M 105
using namespace std;
const string st="yizhong";
int dx[8]={0,-1,-1,-1,0,1,1,1};
int dy[8]={1,1,0,-1,-1,-1,0,1};
struct node{int x,y;}k[10];//存放路径
bool vis[M][M];//标记路径
char a[M][M];//地图
int n;
void deep(int x,int y,int m,string t,int dir)
// x,y,第m步,当前字符串,当前方向
{
if(x<0||y<0||y>=n||x>=n) return ;//如果怼墙了
if(st[m]!=t[m]) return ;//如果找到的第m个字符不等于给定串的第m个字符
k[m]={.x=x,.y=y};//把当前的位置存到路径
if(m==6)//如果找到最后一个字符了
{
for(int i=0;i<7;i++)//在地图上标记这条路径
vis[k[i].x][k[i].y]=1;
return ;
}
int ix=x+dx[dir],iy=y+dy[dir];//给定方向走
deep(ix,iy,m+1,t+a[ix][iy],dir);
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>a[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(a[i][j]=='y')
for(int k=0;k<8;k++)
deep(i,j,0,"y",k);//搜索
for(int i=0;i<n;i++,cout<<endl)
for(int j=0;j<n;j++)
{
if(vis[i][j]==1) cout<<a[i][j];
else cout<<'*';
}
return 0;
}