P1101 单词方阵——————暴力或者DFS

这是一道关于寻找字母方阵中单词的编程题,要求使用暴力搜索或深度优先搜索(DFS)方法。题目要求在n×n的字母方阵中找出所有沿8个方向连续排列的单词“yizhong”,并用*替换非单词的字母。由于数据规模较小,暴力求解也是可行的。解题步骤包括找到起点,判断8个方向上的字母是否符合单词条件,并标记已访问过的字母。通过循环遍历每个点作为起点来完成搜索。
摘要由CSDN通过智能技术生成

P1101 单词方阵

题目描述

给一n \times 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

输入输出格式

输入格式:
第一行输入一个数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

本来是一个DFS的题,不过暴力做的话,也能够过去,
因为数据比较小

第一步:找到起点y
第二步:找八个方向
第三步:在该方向上判断其它数据是否符合
第四步:符合的话就将该方向的vis设为1
回到第一步
循环直到每个点都作为起点遍历过

代码


#include<bits/stdc++.h>
using namespace std;
const int MAXN = 107;
char maze[MAXN][MAXN];
bool  vis[MAXN][MAXN];
int dx[] = {0, 0, 1, 1, 1, -1,-1,-1};
int dy[] = {1, -1, -1, 0, 1, -1, 0, 1};
int n;
char s[10] = "yizhong";
int cnt = 1;
int main()
{
        // freopen("../in.txt","r",stdin);
        // freopen("../out.txt","w",stdout);

        memset(vis,0,sizeof(vis));
        cin>>n;
        for(int i=0; i<n; ++i)
                cin>>maze[i];
        for(int x=0;x<n;++x)
                for(int y=0;y<n;++y)
                        if(maze[x][y] == 'y')//找起点,
                                for(int i=0;i<8;i++)//找方向
                                {
                                        int j;
                                        for(j=1;j<7;j++)//按照这个方向依次遍历
                                        {
                                                int nx = x + j*dx[i];
                                                int ny = y + j*dy[i];
                                                if(maze[nx][ny]!=s[j])//如果某个数不符合,就排除
                                                        break;
                                        }
                                        if(j==7)
                                                for(int k=0;k<7;k++)
                                                        vis[x + k*dx[i]][y + k*dy[i]] = 1;
                                }
        for(int i=0;i<n;++i)
        {
                for(int j=0;j<n;++j)
                        if(vis[i][j])   cout<<maze[i][j];
                        else            cout<<"*";
                cout<<endl;
        }
        return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值