题目连接:该题是luogu试炼场的2-7:T3
题目大意:
1 给一个n*m的字符矩阵,寻找八个方向中,能凑成“yizhong”的字符;
2 按要求输出;
解题思路:
1 想了很久,没发现怎么用搜索,然后枚举一遍就搞定了:
2 每个点都尝试做开头,然后向八个方向进行字符匹配,完。
上代码:
//luogu1101 单词方阵
// 八个方向的判断
// 没有搜索的东西在吧?
#include<cstdio>
#include<cstring>
int dx[8]={0,1,1,1,0,-1,-1,-1};
int dy[8]={1,1,0,-1,-1,-1,0,1};
char st[10]={"0yizhong"};
int n,b[110][110];
char m[110][110],s[11]={"0y"};
void pd(int x,int y)
{
for(int i=0;i<8;i++)
{
int bx=x+6*dx[i];
int by=y+6*dy[i];
//单词末尾是否会越界
if(bx>=1&&bx<=n&&by>=1&&by<=n)
{
int nx=x+dx[i];
int ny=y+dy[i];
for(int j=2;j<=7;j++)//将2-7的字母放入s[]中
{
s[j]=m[nx][ny];
nx+=dx[i];
ny+=dy[i];
}
s[8]='\0';
if(strcmp(s,st)==0)//符合条件的位置,标记
{
b[x][y]=1;
nx=x+dx[i];
ny=y+dy[i];
for(int j=2;j<=7;j++)
{
b[nx][ny]=1;
nx+=dx[i];
ny+=dy[i];
}
}
}
}
}
int main()
{
scanf("%d",&n);
memset(b,0,sizeof(b));
for(int i=1;i<=n;i++)
{
scanf("%s",m[i]+1);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(m[i][j]==st[1])//每个位置都当开头,向8个方向试一遍
{
pd(i,j);
}
}
}
//输出
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(b[i][j]==0) printf("*");
else printf("%c",m[i][j]);
}
printf("\n");
}
return 0;
}