洛谷p1101 单词方阵

简介: 洛谷p1101 单词方阵

题目描述

给一 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

输入格式

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

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

输出格式

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

输入输出样例

输入

7

aaaaaaa

aaaaaaa

aaaaaaa

aaaaaaa

aaaaaaa

aaaaaaa

aaaaaaa


输出

*******

*******

*******

*******

*******

*******

*******

输入

8

qyizhong

gydthkjy

nwidghji

orbzsfgz

hhgrhwth

zzzzzozo

iwdfrgng

yyyygggg


输出

*yizhong

gy******

n*i*****

o**z****

h***h***

z****o**

i*****n*

y******g

#include<iostream>
#include<cstring>
using namespace std;
char a[110][110];  //字符数组
int vis[110][110] = { 0 };  //标记
int n;
int xx[] = { 1, 1, 1, 0, 0,-1,-1,-1 };
int yy[] = { 1, 0,-1, 1,-1, 1, 0,-1 };
string yz = "yizhong";
void dfs(int x, int y)
{
    for (int i = 0; i < 8; i++)
    {
        int flag = 1;
        for (int j = 0; j < 7; j++)
        {
            int dx = x + j * xx[i];
            int dy = y + j * yy[i];
            if (dx < 1 || dx > n || dy < 1 || dy > n || yz [j] != a[dx][dy])
            {
                flag = 0;
                break;
            }
        }
        if (flag == 1)
        {
            for (int j = 0; j < 7; j++)
            {
                int dx = x + j * xx[i];
                int dy = y + j * yy[i];
                vis[dx][dy] = 1;
            }
        }
    }
}
int main()
{
    //输入
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            cin >> a[i][j];
        }
    }
    //找到第一个字母“y”
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            if (a[i][j] == 'y')
            {
                dfs(i, j);
            }
        }
    }
    //输出
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            if (vis[i][j] == 1)
            {
                cout << a[i][j];
            }
            else
            {
                cout << "*";
            }
        }
        cout << endl;
    }
    return 0;
}
目录
相关文章
|
移动开发 算法 机器人
[蓝桥杯] 二分与前缀和习题练习
又来更新了。二分与前缀和是蓝桥杯比较常考的内容,所以我们要多加练习这方面的习题。二分与前缀和的难度相对来说不算大,我们应该掌握其关键要点。
136 0
蓝桥杯:递推 例题:数字三角型问题
蓝桥杯:递推 例题:数字三角型问题
101 0
|
9月前
|
人工智能 算法
最长公共子串
最长公共子串
77 2
|
9月前
|
存储 算法 数据可视化
深入解析力扣161题:相隔为 1 的编辑距离(逐字符比较与动态规划详解)
深入解析力扣161题:相隔为 1 的编辑距离(逐字符比较与动态规划详解)
|
人工智能
线性DP——AcWing 898. 数字三角形、AcWing 895. 最长上升子序列
线性DP——AcWing 898. 数字三角形、AcWing 895. 最长上升子序列
116 0
每日一题——反转字符串中的单词
每日一题——反转字符串中的单词
|
存储
每日一题——字符的最短距离
每日一题——字符的最短距离
93 0
每日一题——字符的最短距离
每日一题——最大回文数乘积
每日一题——最大回文数乘积
139 0