P1101 单词方阵

Posted liuzhaojun

tags:

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

题目描述

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

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

输入格式

第一行输入一个数nn。(7 \le n \le 1007n100)。

第二行开始输入n \times nn×n的字母矩阵。

输出格式

突出显示单词的n \times nn×n矩阵。

输入输出样例

输入 #1
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
输出 #1
*******
*******
*******
*******
*******
*******
*******
输入 #2
8
qyizhong
gydthkjy
nwidghji
orbzsfgz
hhgrhwth
zzzzzozo
iwdfrgng
yyyygggg
输出 #2
*yizhong
gy******
n*i*****
o**z****
h***h***
z****o**
i*****n*
y******g
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int inf=105;
int a[inf][inf],n;
char str[inf][inf];
string s="yyizhong";
struct node
    int x,y;
c[inf];
void dfs(int x,int y,int step,int k,int k1)

    if(x>n||x<1||y>n||y<1)
    return ;
    if(step==8)
    
        for(int i=1;i<8;i++)
        
            a[c[i].x][c[i].y]=1;
        
        return ;    
    
        int x2=x+k;
        int y2=y+k1;
        if(str[x2][y2]==s[step])
        
            c[step].x=x2;
            c[step].y=y2;
            dfs(x2,y2,step+1,k,k1);
                

int main()

    int x1[]=1,-1,0,0,-1,-1,1,1;
    int y1[]=0,0,-1,1,-1,1,-1,1;
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        
            cin>>str[i][j];
        
    fill(a[0],a[0]+inf*inf,0);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        
            if(str[i][j]==y)
            
                    c[1].x=i;
                    c[1].y=j;
                    for(int m=0;m<8;m++)
                        
                    int x2=i+x1[m];
                    int y2=j+y1[m];
                    if(str[x2][y2]==s[2])
                    
                    c[2].x=x2;
                    c[2].y=y2;
                    dfs(x2,y2,3,x1[m],y1[m]);
                        
                    
        
    
    for(int i=1;i<=n;i++)
    
        for(int j=1;j<=n;j++)
        
            if(a[i][j]==1)
            cout<<str[i][j];
            else
            cout<<*;
        
        cout<<endl;
    
    return 0;

还以为会超时,没想到过了

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

洛谷——P1101 单词方阵

P1101 单词方阵 简单dfs

P1101 单词方阵洛谷

Luogu P1101 单词方阵

洛谷 P1101 单词方阵

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