这道题思路还比较简单~直接dfs即可
思路:输入完 n*n的单词以后,开始逐行逐列的枚举,如果找到其中一个是y,那就观察y的8个方向,看看哪一个是 i,然后顺着yi的方向看看能不能找到一条完整的yizhong,如果能找到就将这条路径全部标记为true,到时候输出的时候可以输出这些字符,反之如果不能连续7个yizhong就没必要标记了
如果所示,只有连续的7个“yizhong”这几个字母我们才将他标记,最后输出的时候,标记过的原样输出,没有标记过的就输出星号,怎么样是不是很简单?下面是AC代码~
#include<iostream>
#include <cstring>
using namespace std;
#define Max 200
char word[Max][Max];
bool flag[Max][Max];
void dfs(int now_position,int x,int y,int direction);
char a[]={"yizhong"};
int n;
int dir[9][3]={{0,0,0},{0,-1,0},{0,-1,1},{0,0,1},{0,1,1},{0,1,0},{0,1,-1},{0,0,-1},{0,-1,-1}};
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>word[i];
}
memset(flag,false, sizeof(flag));
for(int i=1;i<=n;i++)
{
for(int j=0;j<=n-1;j++)
{
if(word[i][j]=='y')
{
for(int d=1;d<=8;d++)
{
int nx=i+dir[d][1];
int ny=j+dir[d][2];
if(word[nx][ny]=='i')
{
dfs(1,i,j,d);
}
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<=n-1;j++)
{
if(flag[i][j])
{
cout<<word[i][j];
} else
{
cout<<"*";
}
}
cout<<endl;
}
return 0;
}
void dfs(int now_position,int x,int y,int direction)
{
if(now_position==7)
{
for(int i=1;i<=7;i++) //如果那一个方向成立就标记为true
{
flag[x][y]=true;
x-=dir[direction][1];
y-=dir[direction][2];
}
}
else
{
int nx=x+dir[direction][1];
int ny=y+dir[direction][2];
if(nx>=1&&nx<=n&&ny>=0&&ny<=n-1&&word[nx][ny]==a[now_position])
{
dfs(now_position+1,nx,ny,direction);
}
else
{
return ;
}
}
}