星星灰暗着。

星星灰暗着。

你所见的的确是一个NOIp退役OIer的博客。

题解 P1101 【单词方阵】

posted on 2016-11-14 23:46:47 | under 题解 |

做到一半发现不是搜索是枚举......

于是我就用枚举做了23333

基本想法是先循环找y然后八个边找i,按这条直线枚举,若确实是yizhong就标记

输出的时候按标记输出就可以了。

顺便说一句,不能用getchar吞换行,用个字符串吧XD

上代码

#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;
}