洛谷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;
}
目录
相关文章
|
9月前
|
存储 算法
《LeetCode》—— 摆动序列
《LeetCode》—— 摆动序列
|
9月前
|
人工智能 算法 BI
数学知识:质数与约数
数学知识:质数与约数
77 0
|
9月前
|
Java
leetcode-376:摆动序列
leetcode-376:摆动序列
55 0
|
8月前
|
存储 算法 数据可视化
深入解析力扣161题:相隔为 1 的编辑距离(逐字符比较与动态规划详解)
深入解析力扣161题:相隔为 1 的编辑距离(逐字符比较与动态规划详解)
|
9月前
|
算法 测试技术 C#
【数学】【数论】【最大公约数】1819. 序列中不同最大公约数的数目
【数学】【数论】【最大公约数】1819. 序列中不同最大公约数的数目
|
机器学习/深度学习 算法
算法分析 | 第三套(渐近符号)
算法分析 | 第三套(渐近符号)
119 0
一个求公约数和公倍数的有趣求法
一个求公约数和公倍数的有趣求法
78 0
|
算法 C++
每日算法系列【LeetCode 376】摆动序列
每日算法系列【LeetCode 376】摆动序列
111 0
|
算法 C++
【动态规划篇】最少分割回文 && 编辑距离 && 不同的子序列
【动态规划篇】最少分割回文 && 编辑距离 && 不同的子序列
【动态规划篇】最少分割回文 && 编辑距离 && 不同的子序列
|
算法
LeetCode:376. 摆动序列——说什么贪心和动规~
如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如, [1, 7, 4, 9, 2, 5] 是一个 摆动序列 ,因为差值 (6, -3, 5, -7, 3) 是正负交替出现的。 相反,[1, 4, 7, 2, 5] 和 [1, 7, 4, 5, 5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。 子序列 可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。
137 0