题解 P1101 【单词方阵】
teafrogsf
2016-11-14 23:46:47
做到一半发现不是搜索是枚举......
于是我就用枚举做了23333
基本想法是**先循环找y然后八个边找i,按这条直线枚举,若确实是yizhong就标记**;
输出的时候按标记输出就可以了。
顺便说一句,**不能用getchar吞换行**,用个字符串吧XD
上代码
```cpp
#include<stdio.h>
char a[110][110];
int dx[10]={0,-1,1,0,0,-1,-1,1,1},dy[10]={0,0,0,-1,1,-1,1,-1,1},flag[110][110],n;
bool book[110][110];
char yz[10]={0,'i','z','h','o','n','g'};
void dfs(int x,int y)
{
int i,j;
int xx=x,yy=y;
for(i=1;i<=8;)
{
xx=x+dx[i];yy=y+dy[i];
//printf("%d %d %c\n",xx,yy,a[xx][yy]);
if(a[xx][yy]=='i'&&xx>=1&&xx<=n&&yy>=1&&yy<=n)
{
if(x+6*dx[i]<1||x+6*dx[i]>n||y+6*dy[i]<1||y+6*dy[i]>n)goto next;
for(j=2;j<=6;j++)
{
//printf("%d %d %c\n",x+j*dx[i],y+j*dy[i],a[x+j*dx[i]][y+j*dy[i]]);
if(a[x+j*dx[i]][y+j*dy[i]]!=yz[j])goto next;
}
for(j=0;j<=6;j++)flag[x+j*dx[i]][y+j*dy[i]]=1;
}
next:
i++;
}
}
int main()
{
int i,j;
char instead[110];
scanf("%d",&n);
for(i=1;i<=n;i++)
{
gets(instead);
for(j=1;j<=n;j++)scanf("%c",&a[i][j]);
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(a[i][j]=='y')dfs(i,j);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(flag[i][j])printf("%c",a[i][j]);
else printf("*");
}
puts("");
}
return 0;
}
```