P1101 单词方阵

题目描述

给一n imes 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 imes nn×n的字母矩阵。

输出格式

突出显示单词的n imes 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;
}

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

原文地址:https://www.cnblogs.com/liuzhaojun/p/11298611.html