P1101 单词方阵

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

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

输入输出格式

输入格式:
第一行输入一个数n。(1007≤n≤100)。

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

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

输入输出样例

输入样例#1: 复制
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
输出样例#1: 复制
给一n×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。(1007≤n≤100)。

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

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

输入输出样例

输入样例#1: 复制
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
输出样例#1: 复制

*******
*******
*******
*******
*******
*******
*******
#include <iostream>
#include <cstring>
using namespace std;
bool flag[110][110]={0};
bool s[110][110]={0};
char a[110][110]={0};
int c[110]={0},d[110]={0};
char h[10]={"yizhong"};
bool r[8]={0};//上下左右,左上右上,左下右下 
int n;
void dfs(int x,int y,int cur){

    int i,j;

    if(cur>=7){

        for(i=0;i<7;i++){

            s[c[i]][d[i]]=1;

        }

    }else{

        if(a[x-1][y]==h[cur]&&r[0]||a[x-1][y]==h[cur]&&cur==1){//上 

            if(cur==1) r[0]=1;

            c[cur]=x-1,d[cur]=y;

            dfs(x-1,y,cur+1);

            c[cur]=0,d[cur]=0,r[0]=0; 

        } 

        if(a[x+1][y]==h[cur]&&r[1]||a[x+1][y]==h[cur]&&cur==1){//下 

            if(cur==1)  r[1]=1;

            c[cur]=x+1,d[cur]=y;

            dfs(x+1,y,cur+1);

            c[cur]=0,d[cur]=0,r[1]=0;

        } 

        if(a[x][y+1]==h[cur]&&r[2]||a[x][y+1]==h[cur]&&cur==1){//右

            if(cur==1) r[2]=1;

            c[cur]=x,d[cur]=y+1;

            dfs(x,y+1,cur+1);

            r[2]=0;c[cur]=0,d[cur]=0;

        }

        if(a[x][y-1]==h[cur]&&r[3]||a[x][y-1]==h[cur]&&cur==1){//左

            if(cur==1) r[3]=1;

            c[cur]=x,d[cur]=y-1;

            dfs(x,y-1,cur+1);

            r[3]=0;c[cur]=0,d[cur]=0;

        }

        if(a[x-1][y-1]==h[cur]&&r[4]||a[x-1][y-1]==h[cur]&&cur==1){//左上                                                   

            if(cur==1) r[4]=1;

            c[cur]=x-1,d[cur]=y-1;

            dfs(x-1,y-1,cur+1);

            r[4]=0;c[cur]=0,d[cur]=0;

        }
        if(a[x+1][y-1]==h[cur]&&r[5]||a[x+1][y-1]==h[cur]&&cur==1){//左下

            if(cur==1) r[5]=1;

            c[cur]=x+1,d[cur]=y-1;

            dfs(x+1,y-1,cur+1);

            r[5]=0;c[cur]=0,d[cur]=0;


        }

        if(a[x-1][y+1]==h[cur]&&r[6]||a[x-1][y+1]==h[cur]&&cur==1){//右上 

            if(cur==1) r[6]=1;

            c[cur]=x-1,d[cur]=y+1;

            dfs(x-1,y+1,cur+1);

            r[6]=0;c[cur]=0,d[cur]=0;


        }
        if(a[x+1][y+1]==h[cur]&&r[7]||a[x+1][y+1]==h[cur]&&cur==1){//右下 

            if(cur==1) r[7]=1;

            c[cur]=x+1,d[cur]=y+1;

            dfs(x+1,y+1,cur+1);

            r[7]=0;c[cur]=0,d[cur]=0;


        }


    }
}
int main()
{
    cin>>n;

    int i,j;

    for(i=0;i<n;i++){

        for(j=0;j<n;j++) cin>>a[i][j];

    }

    for(i=0;i<n;i++){

        for(j=0;j<n;j++){

            if(a[i][j]=='y'){

                c[0]=i,d[0]=j;

                dfs(i,j,1);


            }

        }


    }

    for(i=0;i<n;i++){

        for(j=0;j<n;j++){

            if(!s[i][j]) cout<<"*"; 
            else cout<<a[i][j];
        }
        cout<<endl;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值