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

【洛谷P9303题解】AC- [CCC 2023 J5] CCC Word Hunt

在CCC单词搜索游戏中,单词隐藏在一个字母网格中。目标是确定给定单词在网格中隐藏的次数。单词可以以直线或直角的方式排列。以下是详细的解题思路及代码实现:

传送门: https://www.luogu.com.cn/problem/P9303

解题思路

  1. 输入读取与初始化

    • 读取要搜索的单词和网格的行数、列数。
    • 将网格存储为二维向量。
  2. 方向定义

    • 定义八个可能的搜索方向,包括上、右上、右、右下、下、左下、左、左上。
  3. 边界检查

    • 检查给定的坐标是否在网格范围内。
  4. 深度搜索

    • 从网格中每个与单词首字母匹配的位置开始,向八个方向进行深度搜索。
    • 在搜索过程中,可以继续沿当前方向或在未转过弯的情况下沿垂直方向继续搜索。
  5. 计数

    • 统计所有可能的单词匹配方式,并输出总的匹配次数。

代码实现

#include <iostream>
#include <vector>
#include <string>using namespace std;int r, c;
string word;
int length;
vector<vector<string>> graph;// 定义八个可能的搜索方向
const int dx[8] = {-1,-1, 0, 1, 1, 1, 0,-1};
const int dy[8] = { 0, 1, 1, 1, 0,-1,-1,-1};// 检查坐标是否在网格范围内
bool good(int x, int y) {return x >= 0 && x < r && y >= 0 && y < c;
}// 深度搜索函数
int search(int x, int y, int cur, bool turned, int dirn) {if (cur == length - 1) return 1; // 找到完整匹配int cnt = 0;// 继续沿当前方向搜索int nx = x + dx[dirn], ny = y + dy[dirn];if (good(nx, ny) && graph[nx][ny] == string(1, word[cur + 1])) {cnt += search(nx, ny, cur + 1, turned, dirn);}// 如果未转过弯,尝试沿垂直方向搜索if (!turned) {int turnDirs[2] = {(dirn + 2) % 8, (dirn + 6) % 8}; // 计算垂直方向for (int k = 0; k < 2; ++k) {int newDir = turnDirs[k];int tx = x + dx[newDir], ty = y + dy[newDir];if (good(tx, ty) && graph[tx][ty] == string(1, word[cur + 1])) {cnt += search(tx, ty, cur + 1, true, newDir);}}}return cnt;
}int main() {cin >> word;length = word.length();cin >> r >> c;// 初始化网格graph.resize(r, vector<string>(c));for (int i = 0; i < r; ++i)for (int j = 0; j < c; ++j)cin >> graph[i][j];int count = 0;// 遍历网格,寻找所有可能的起点for (int i = 0; i < r; ++i) {for (int j = 0; j < c; ++j) {if (graph[i][j] == string(1, word[0])) { // 找到单词首字母for (int k = 0; k < 8; ++k) { // 尝试所有方向int ni = i + dx[k], nj = j + dy[k];if (good(ni, nj) && graph[ni][nj] == string(1, word[1])) { // 确保第二字母匹配count += search(ni, nj, 1, false, k); // 开始深度搜索}}}}}cout << count << endl; // 输出结果return 0;
}

总结

以上代码实现了对字母网格中单词的搜索,能够处理单词以直线或直角方式排列的情况。通过深度搜索,代码能够有效地找出所有可能的匹配,并统计匹配次数。

http://www.xdnf.cn/news/9205.html

相关文章:

  • 功耗仅4W!迷你服务器黑豹X2(Panther X2)卡刷、线刷刷入Armbian(ubuntu)系统教程
  • 鸿蒙OSUniApp 制作美观的文章列表展示组件#三方框架 #Uniapp
  • 11.12 LangGraph全局共享状态实战:200ms实现50+仓库AI协同,效率飙升!
  • vscode的Embedded IDE创建keil项目找不到源函数或者无法跳转
  • windows中Redis、MySQL 和 Elasticsearch启动并正确监听指定端口
  • 亚马逊服务器磁盘扩容一般操作
  • 基于springboot的校园商铺管理系统的设计与实现
  • 大型三甲医院更换HIS系统全流程分析与经验考察(下)
  • 【React】-组件中实现高性能鼠标跟随提示框的完整优化过程
  • AI赋能引爆短剧全球化风潮,腾讯云媒体处理助力短剧平台出海吸金
  • 中国免税品人工智能商城:引领免税品市场新潮流
  • transformer总结
  • 华为OD机试真题——斗地主之顺子(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • QAtomicInt原子变量的CAS(Compare And Swap)写法与优缺点
  • 通信算法之279:数据链/自组网通信设备--MIMO(2T2R)-OFDM系统系列--实际工程应用算法代码--2.OFDM参数设计及帧结构设计
  • 批量无人值守装机(使用cobbler批量安装windows)
  • 用提示词写程序(2),VSCODE+Claude3.5开发edge扩展插件
  • SuperMap GIS基础产品FAQ集锦(20250519)
  • vue + ant-design + xlsx 实现表格数据导出
  • AcrelEMS 3.0智慧能源管理平台:构建企业微电网数智化中枢
  • watchEffect
  • python神经网络学习小结2
  • python时间序列处理
  • 总结:进程和线程的联系和区别
  • 快速上手SHELL脚本常用命令
  • SAP成本核算-事中控制(成本对象控制/成本归集与结算)
  • OpenGL多重渲染
  • 基于Robust Video Matting 使用Unity 实现无绿幕实时人像抠图
  • GJOI 5.24 题解
  • 时空弯曲和测地线浅谈