洛谷P1101单词方阵(小改了一下)

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

输入格式:
第一行输入一个数n。(7≤n≤100)。
第二行开始输入n×n的字母矩阵。

输出格式:
突出显示单词的n×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
这道题是一道深度优先搜索染色题


以下是AC代码

  #include<bits/stdc++.h>
    using namespace std;
    int N;
    char map[105][105];
    bool vis[105][105];//用来记录可以组成标准串的布尔二维数组
    string STR="yizhong";//标准的string串 
    int dir[8][2]={ {0,1}, {-1,1}, {-1,0},  {-1,-1}, {0,-1}, {1,-1}, {1,0}, {1,1} };//方向数组
    /*
    x表示当前位置的横坐标,Y表示纵坐标,cnt表示当前搜到第几层了,DIR表示当前的搜索方向 
    */ 
    bool dfs(int x,int y,int cnt,int xty)
    {
        if(cnt==6)//判断是否搜到了第?层 <***这里是从0开始搜的,所以0-6表示搜完***了>
        {
            vis[x][y]=true;//标记当前位置是可以组成单词的
            return true;//返回真表示按照当前方向搜可以组成单词
        }
        int tx=x+dir[xty][0];
        int ty=y+dir[xty][1];
        if(tx>=1 && tx<=N && ty>=1 && ty<=N && map[tx][ty]==STR[cnt+1])//判断是否出界
        {
            if(dfs(tx,ty,cnt+1,DIR))//这里调用递归,当搜到cnt=6时才会逐层回归,层层嵌套,从第六层往回返。
            {
                vis[tx][ty]=1;
                 return true;
            }
        }
        return false;//六层中当搜到某一层不符合时就会返回FALSE。
    }
    int main()
    {
       //数据的输入如下
        cin>>N;
        for(int i=1; i<=N; i++)
        {
            for(int j=1; j<=N; j++)
            {
                cin>>map[i][j];
            }
        }
        //逐个处理数据
        for(int i=1; i<=N; i++)
        {
            for(int j=1; j<=N; j++)
            {
                if(map[i][j]=='y')
                {     for(int k=0; k<8; k++)//方向 
                        {
                           int tx=i+dir[k][0];
                            int ty=j+dir[k][1];
                         if(tx>=1 && tx<=N && ty>=1 && ty<=N && map[tx][ty]==STR[1] )//找有可能构成单词的方向然后传给 DFS函数
                         {
                            if(dfs( i,j,0,k))
                                vis[i][j]=1;//关联是否输出“*”
                         } 
                     }
                 }
            }
        }
        //数据的输出
        for(int i=1; i<=N; i++)
        {
            for(int j=1; j<=N; j++)
            {
                if(vis[i][j])
                    cout<<map[i][j];
                else
                    cout<<"*";
            }
            cout<<endl;
        }
        return 0;
     }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值