当前位置: 首页 > news >正文

【洛谷 P1101】单词方阵 题解(深度优先搜索)

单词方阵

题目描述

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

输入格式

第一行输入一个数 n n n ( 7 ≤ n ≤ 100 ) (7 \le n \le 100) (7n100)

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

输出格式

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

样例 #1

样例输入 #1

7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa

样例输出 #1

*******
*******
*******
*******
*******
*******
*******

样例 #2

样例输入 #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

思路

二维数组 dir 用于表示八个方向的偏移量。

读入 a 方阵的同时初始化 b 方阵为全 *

使用三重循环,遍历每一个坐标及其八个方向,并使用深度优先搜索算法搜索,在当前位置 (x, y) 的基础上,根据当前方向 d 和目标单词的下一个字母 p,判断是否能够继续匹配。如果匹配成功,继续在当前方向上递归查找下一个字母。

dfs 函数中,如果成功找到了单词的最后一个字母,将 b 方阵当前位置的字符设为单词的最后一个字母。递归回到上一层dfs 函数时,将 b 方阵当前位置的字符设为 a 方阵对应坐标字母。

注意:同一单词摆放时不再改变方向。


AC代码

#include <iostream>
#define AUTHOR "HEX9CF"
using namespace std;const int N = 105;
const char *w = "yizhong";
const int dir[8][2] = {{-1, -1},{-1, 0},{-1, 1},{0, -1},{0, 1},{1, -1},{1, 0},{1, 1}};int n;
char a[N][N], b[N][N];bool dfs(int x, int y, int p, int d)
{bool flg = 0;if (w[p] == a[x][y]){if (p == 6){b[x][y] = w[p];return 1;}// cout << x << " " << y << " " << d << " " << a[x][y] << endl;int xx = x + dir[d][0];int yy = y + dir[d][1];if (xx > 0 || xx < n || yy > 0 || yy < n){if (dfs(xx, yy, p + 1, d)){flg = 1;}}}if (flg){b[x][y] = w[p];}return flg;
}int main()
{cin >> n;for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){cin >> a[i][j];b[i][j] = '*';}}for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){for (int k = 0; k < 8; k++){dfs(i, j, 0, k);}}}for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){putchar(b[i][j]);}putchar('\n');}return 0;
}
http://www.lryc.cn/news/216760.html

相关文章:

  • 教师减负神器
  • Web 开发之前的一些话
  • git快速入门!!! git的常用命令!!!
  • C++并发编程实战——01.并发与并行
  • PLC如何远程控制、调试?贝锐蒲公英二层组网功能一招搞定
  • 【大数据】-- flink kubernetes operator 入门与实践
  • 网络安全在代理技术中的实现与应用
  • Nginx搭配负载均衡和动静分离:构建高性能Web应用的完美组合
  • windows 运行 Mysql Command Line Client 自动关闭闪退原因分析
  • 在CATIA工程制图中自动生成尺寸
  • 蓝桥杯 (C++ 求和 等差数列 顺子日期 灌溉)
  • Spring AOP基于XML方式笔记整理
  • Docker HTTP(S) Proxy代理方式连接互联网
  • 华纳云:centos系统中怎么查看cpu信息?
  • 如何选择微信管理系统?
  • 文字的力量
  • 荒野大镖客emp.dll文件丢失的怎么办,快速修复游戏dll问题
  • 力扣labuladong——一刷day20
  • XSpirit 2智能边缘计算机使用测评
  • python实现MC协议(SLMP 3E帧)的TCP服务端(篇二)
  • nodejs express uniapp 图书借阅管理系统源码
  • 从零开始的目标检测和关键点检测(一):用labelme标注数据集
  • 【JVM经典面试题(五十二道)】
  • 高效管理:在文件夹名称左边添加关键字,实现批量重命名
  • Leetcode1122. 数组的相对排序
  • CN考研真题知识点二轮归纳(5)
  • windows系统 生成RSA密钥对
  • 大文件分片上传并发
  • 数据结构——基于顺序表实现通讯录
  • 行业追踪,2023-11-03