P1101 单词方阵

题目描述

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

 

输入格式

第一行输入一个数n。(7≤n≤1007≤n≤100)。

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

输出格式

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

输入输出样例

#include <bits/stdc++.h>
using namespace std;


int n,f[200][200];
char mat[200][200];
char p[]={'y','i','z','h','o','n','g'};
struct point{
    int x,y;
};
int ax[]={-1,-1,0,1,1,1,0,-1},ay[]={0,1,1,1,0,-1,-1,-1};
stack<point>sta;

bool match(char c){
    for(int i=0;i<7;i++)
        if(p[i]==c)return true;
        return false;
}

bool dfs(int x,int y,int c,int d){
    if(mat[x][y]!=p[c]) return false;
    else if(mat[x][y]==p[c]&&c==6){
        f[x][y]=1;
          return true;
    }
    if(dfs(x+ax[d], y+ay[d], c+1,d)){
        f[x][y]=1;
        return true;
    }
    return false;
}


int main() {
 
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        string s ;
        cin>>s;
        for(int j=1;j<=n;j++){
            mat[i][j]=s[j-1];
            if(mat[i][j]=='y')
                sta.push({i,j});
            if(!match(mat[i][j]))mat[i][j]='*';
        }
    }
    
    while (!sta.empty()) {
        point ps = sta.top();
        sta.pop();
        for(int i=0;i<8;i++)dfs(ps.x,ps.y,0,i);
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
            if(mat[i][j]!='*'&&f[i][j]==1)printf("%c",mat[i][j]);
            else printf("*");
        printf("\n");
    }
    return 0;
}



 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值