不算搜索的搜索
思路和很多人的一样,因为只要找到两个字母,方向就确定了,记录下方向,剩下的暴力即可。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int fx[9][2]={{0,0},{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};//存方向,循环起来比较方便
char map[101][101], word[8]={‘!‘,‘y‘,‘i‘,‘z‘,‘h‘,‘o‘,‘n‘,‘g‘};//word存需要比对的字母
bool a[101][101];//记录单词的位置
int jl[10][2],k; //jl用来存字母的坐标,当七个字母全找完统一赋值
//k用来存方向
void dfs(int x,int y,int z)
{
if(z==1)
{
for(int m=1;m<=8;m++)//枚举方向
{
if(map[x+fx[m][0]][y+fx[m][1]]==word[2])//两个字母确定方向
{
k=m; //记录方向
jl[z][0]=x,jl[z][1]=y; //存坐标
dfs(x+fx[k][0],y+fx[k][1],2); //向下寻找
}
}
}
int tot=1; //记录匹配的字母个数
for(int m=2;m<=7;m++)
{
if(map[x+(m-2)*fx[k][0]][y+(m-2)*fx[k][1]]==word[m]) //不断向下匹配
{
tot=m;
jl[m][0]=x+(m-2)*fx[k][0]; //记录坐标
jl[m][1]=y+(m-2)*fx[k][1];
}
else
break;
}
if(tot==7) //如果字母全部匹配
{
for(int w=1;w<=7;w++)
{
a[jl[w][0]][jl[w][1]]=1; //统一赋值
}
}
}
int main()
{
//输入,防止意外,用getchar()读掉换行符
scanf("%d",&n);
getchar();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>map[i][j];
}
getchar();
}
//算法主体
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(map[i][j]==‘y‘)
{
dfs(i,j,1);
}
}
//输出
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j])
printf("%c",map[i][j]);
else
printf("*");
}
cout<<endl;
}
return 0;
}