luogu 1101单词方阵

Posted ioioioioioio

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu 1101单词方阵相关的知识,希望对你有一定的参考价值。

题目描述

给一nXn的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间[color=red]可以[/color]交叉,因此有可能共用字母。输出时,将不是单词的字母用“*”代替,以突出显示单词。例如:

输入:
    8                     输出:
    qyizhong              *yizhong
    gydthkjy              gy******
    nwidghji              n*i*****
    orbzsfgz              o**z****
    hhgrhwth              h***h***
    zzzzzozo              z****o**
    iwdfrgng              i*****n*
    yyyygggg              y******g

输入输出格式

输入格式:

 

第一行输入一个数n。(7<=n<=100)。

第二行开始输入nXn的字母矩阵。

 

输出格式:

 

突出显示单词的nXn矩阵。

 

输入输出样例

输入样例#1:
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
输出样例#1:
*******
*******
*******
*******
*******
*******
*******
 
//记录每个 y 的位置,将每个 y 进行一次深搜,8 个方向
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>

using namespace std;
const int N=110;
const char s[]={ ,y,i,z,h,o,n,g};

char c[N][N],my;
int a[N][N];
int n;
struct node{
    int x,y;
}E[N*N];
int js;

inline int read()
{
    int x=0;char c=getchar();
    while(c<0||c>9)c=getchar();
    while(c>=0&&c<=9)x=x*10+c-0,c=getchar();
    return x;
}

void bfs(int num)
{
        int x=E[num].x,y=E[num].y;
        if(x>=7)
        {
            bool flag=1;
            for(int i=1;i<=6&&flag;i++)
                if(c[x-i][y]!=s[i+1])
                    flag=0;
            for(int i=0;flag&&i<=6;i++)
                a[x-i][y]=3;
        }
        if(n-x>=6)
        {
            bool flag=1;
            for(int i=1;i<=6&&flag;i++)
                if(c[x+i][y]!=s[i+1])
                    flag=0;
            for(int i=0;flag&&i<=6;i++)
                a[x+i][y]=3;    
        }
        if(y>=7)
        {
            bool flag=1;
            for(int i=1;i<=6&&flag;i++)
                if(c[x][y-i]!=s[i+1])
                    flag=0;
            for(int i=0;i<=6&&flag;i++)
                a[x][y-i]=3;
        }
        if(n-y>=6)
        {
            bool flag=1;
            for(int i=1;i<=6&&flag;i++)
                if(c[x][y+i]!=s[i+1])
                    flag=0;
            for(int i=0;flag&&i<=6;i++)
                a[x][y+i]=3;
        }
        if(x>=7&&y>=7)
        {
            bool flag=1;
            for(int i=1;i<=6&&flag;i++)
                if(c[x-i][y-i]!=s[i+1])
                    flag=0;
            for(int i=0;flag&&i<=6;i++)
                a[x-i][y-i]=3;
        }
        if(n-x>=6&&y>=7)
        {
            bool flag=1;
            for(int i=1;i<=6&&flag;i++)
                if(c[x+i][y-i]!=s[i+1])
                    flag=0;
            for(int i=0;flag&&i<=6;i++)
                a[x+i][y-i]=3;
        }
        if(x>=7&&n-y>=6)
        {
            bool flag=1;
            for(int i=1;i<=6&&flag;i++)
                if(c[x-i][y+i]!=s[i+1])
                    flag=0;
            for(int i=0;flag&&i<=6;i++)
                a[x-i][y+i]=3;
        }
        if(n-x>=6&&n-y>=6)
        {
            bool flag=1;
            for(int i=1;i<=6&&flag;i++)
                if(c[x+i][y+i]!=s[i+1])
                    flag=0;
            for(int i=0;flag&&i<=6;i++)
                a[x+i][y+i]=3;    
        }
        return ; 
} 

int main()
{
    n=read();
    scanf("%c",&my);
    
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            cin>>my;
            c[i][j]=my;
            if(my==y)
                E[++js].x=i,E[js].y=j;
        }
        
    for(int i=1;i<=js;i++)
        bfs(i);
        
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            if(a[i][j]==3)
                printf("%c",c[i][j]);
            else
                printf("*");
        printf("\n");
    }
    
    return 0;
}
/*
8                 
qyizhong
gydthkjy
nwidghji
orbzsfgz
hhgrhwth
zzzzzozo
iwdfrgng
yyyygggg
*/

 

以上是关于luogu 1101单词方阵的主要内容,如果未能解决你的问题,请参考以下文章

P1101 单词方阵洛谷

洛谷——P1101 单词方阵

落谷P1101 单词方阵 //参考代码

洛谷 P1101 单词方阵题解

P1101 单词方阵

P1101 单词方阵