洛谷 P1101 单词方阵

P1101 单词方阵

题目链接:https://www.luogu.org/problemnew/show/P1101

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

输入:
8 输出:
qyizhong yizhong
gydthkjy gy
*****
nwidghji ni****
orbzsfgz oz******
hhgrhwth hh****
zzzzzozo zo
iwdfrgng i
n**
yyyygggg y**g
输入输出格式
输入格式:
第一行输入一个数n。(7≤n≤100)。

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

输出格式:
突出显示单词的n×n矩阵。

解法:该题只需要遍历一遍方阵,如果是‘y’就向八个方向搜索,搜到完整的单词后在数组中将其标记,输出的时候看有无标记输出就行。

ac代码:

#include <bits/stdc++.h>

using namespace std;

char a[7]={'y','i','z','h','o','n','g'};
char s[101][101];
int f[101][101];
int p[10],q[10];//记录点坐标
int dx[8]={0, 0, 1, 1, 1,-1,-1,-1};
int dy[8]={1,-1,-1, 0, 1,-1, 1, 0};//搜索的方向
int n;

void dfs(int x,int y,int z,int t){
    if(x<0||x>=n||y<0||y>=n||z>6)return;//如果越界或者单词长度超了就结束
    if(s[x][y]!=a[z])return;//如果对应的字母不符合就结束
    p[z]=x,q[z]=y;//记录当前点的坐标
    if(z==6){
        for(int i=0;i<7;i++){
            f[p[i]][q[i]]=1;
        }
        return ;
    }
    dfs(x+dx[t],y+dy[t],z+1,t);
}

int main()
{

    cin>>n;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cin>>s[i][j];
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(s[i][j]=='y'){
                for(int k=0;k<8;k++){
                    dfs(i,j,0,k);
                }
            }
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(f[i][j])cout<<s[i][j];
            else cout<<'*';
        }
        cout<<endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值