oj地址是韩国网站 连接比较慢 https://algospot.com/judge/problem/read/BOGGLE
大意如下

输入输出

输入

URLPM
XPRET
GIAET
XTNZY
XOQRS PRETTY
GIRL
REPEAT
KARA
PANDORA
GIAZAPX 输出
PRETTY YES
GIRL YES
REPEAT YES
KARA NO
PANDORA NO
GIAZAPX YES

估摸着很简单 就蹭蹭8个方向DFS 代码写完
测试用例过了
代码如下

#include <iostream>
#include <string>
#include <vector> using namespace std; int n, m;
int record = ;
const int dx[] = { -,-,-,,,,, };
const int dy[] = { -,,,-,,,-, }; bool isrange(int x, int y) {
if (x < || x >= || y < || y >= )
return false; return true;
} bool hasword(int x, int y, const string& word ,int idx,const vector<vector<char>>& table)
{
if (!isrange(x, y)) return false; if (table[x][y] != word[idx]) return false; if (idx == word.size()-) return true; for (int i = ; i < ; i++) {
int nextx = x + dx[i];
int nexty = y + dy[i];
if (hasword(nextx, nexty, word,idx+, table))
return true;
} return false;
} int main()
{
int t = ;
cin >> t;
while (t--) {
vector<vector<char>> table(, vector<char>(, ));
for (int i = ; i < ; i++) {
for (int j = ; j < ; j++) {
cin >> table[i][j];
}
} int check = ;
cin >> check;
vector<string> checkWord; while (check--) {
string s;
cin >> s;
int find = ;
record = ;
for (int i = ; i < ; i++) {
for (int j = ; j < ; j++) {
if (hasword(i, j, s, ,table)) {
cout << s << " YES" << endl;
find = ;
goto LABEL;
}
}
} LABEL:
if ( == find) {
cout << s << " NO" << endl;
}
}
} return ;
}

但是居然一个特殊用例过不了 代码被判为TLE

输入

AAAAA
AAAAA
AAAAA
AACCC
AACCB AAAAAAAAAB

左思右想不得其门 只得针对该例子进行了特殊处理 翻转字符串!
添加代码不多 仅仅多了 reverse(s.begin(), s.end()); 一行

 #include <iostream>

 #include <iostream>
#include <string>
#include <vector>
#include <algorithm> using namespace std; int n, m; const int dx[] = { -,-,-,,,,, };
const int dy[] = { -,,,-,,,-, }; vector<vector<int>> mem(, vector<int>(, )); bool isrange(int x, int y) {
if (x < || x >= || y < || y >= )
return false; return true;
} bool hasword(int x, int y, const string& word, int idx, const vector<vector<char>>& table)
{
if (!isrange(x, y)) {
return false;
} if (table[x][y] != word[idx]) { return false;
} if (idx >= word.size() - ) return true; for (int i = ; i < ; i++) {
int nextx = x + dx[i];
int nexty = y + dy[i];
if (hasword(nextx, nexty, word, idx + , table))
return true;
} return false;
} int main()
{
int t = ;
cin >> t;
while (t--) {
vector<vector<char>> table(, vector<char>(, ));
for (int i = ; i < ; i++) {
for (int j = ; j < ; j++) {
cin >> table[i][j];
}
} int check = ;
cin >> check;
vector<string> checkWord; while (check--) {
string s;
cin >> s;
string copys = s;
reverse(s.begin(), s.end());
int find = ;
for (int i = ; i < ; i++) {
for (int j = ; j < ; j++) {
mem[i][j] = ;
}
}
for (int i = ; i < ; i++) {
for (int j = ; j < ; j++) {
if (hasword(i, j, s, , table)) {
cout << copys << " YES" << endl;
find = ;
goto LABEL;
}
}
} LABEL:
if ( == find) {
cout << copys << " NO" << endl;
}
}
} return ;
}

但是实际上 当测试字符串为AAAAAAAAABAAAAAAAA 也一样会TLE
所以 实际上我们需要使用数组缓存从当前格子出发不能解决的字符串记录 避免多次重复尝试失败的路径
代码添加了一个变量数组
int d[x][y][l]; 记录x y格子出发的尝试匹配长度为l的字符串 能否成功,如果失败则置0。
下次DFS 发现该标记为 0 则直接返回 不进行尝试

 #include <bits/stdc++.h>
using namespace std;
int T,n,c[][],cw[],len[];
char a[][],w[][];
int nx[] = {,,-,-,-,,,},ny[] = {,,,,-,-,-,};
int dx,dy,is;
int d[][][]; int dfs(int x,int y,int now,int l)
{
if(d[x][y][l]) return ;
if(l == len[now]) return ;
d[x][y][l] = ;
is = ;
for(int i = ;i < ;i++)
{
dx = x+nx[i];
dy = y+ny[i];
if(a[dx][dy] == w[now][l])
{
if(dfs(dx,dy,now,l+))
{
//c[x][y] = 0;
return ;
}
}
}
//d[x][y][l] = 0;
return ;
} int main()
{
scanf("%d",&T);
while(T--)
{
memset(cw,,sizeof(cw));
for(int i = ;i <= ;i++)
{
for(int j = ;j <= ;j++)
{
scanf(" %c",&a[i][j]);
}
}
scanf("%d",&n);
for(int i = ;i <= n;i++)
{
scanf("%s",w[i]);
len[i] = strlen(w[i]);
for(int j = ;j <= ;j++)
{
for(int k = ;k <= ;k++)
{
if(a[j][k] == w[i][])
{
if(dfs(j,k,i,))
{
cw[i] = ;
break;
}
}
}
if(cw[i]) break;
}
memset(d,,sizeof(d));
}
for(int i = ;i <= n;i++)
{
printf("%s %s\n",w[i],((cw[i] == ) ? "YES" : "NO"));
}
}
}

《算法问题实战策略》 BOGGLE的更多相关文章

  1. 算法问题实战策略 PICNIC

    下面是另一道搜索题目的解答过程题目是<算法问题实战策略>中的一题oj地址是韩国网站 连接比较慢 https://algospot.com/judge/problem/read/PICNIC ...

  2. 《算法问题实战策略》-chaper7-穷举法

    关于这一章节<算法实战策略>有一段概述问题,我认为对于编程人员来说非常有价值,故在这里进行如下的摘抄: 构想算法是很艰难的工作.相比大家都经历过,面对复杂的要求只是傻乎乎地盯着显示器,或者 ...

  3. 《算法问题实战策略》-chaper32-网络流

    基本的网络流模型: 在图论这一块初步的应用领域中,两个最常见的关注点,其一时图中的路径长度,也就是我们常说的的最短路径问题,另一个则是所谓的“流问题”. 流问题的基本概念: 首先给出一张图. 其实所谓 ...

  4. 《算法问题实战策略》-chaper13-数值分析

    这一章节主要介绍我们在进行数值分析常用的二分.三分和一个近似求解区间积分的辛普森法. 首先介绍二分. 其实二分的思想很好理解并且笔者在之前的一些文章中也有所渗透,对于二次函数甚至单元高次函数的零点求解 ...

  5. 《算法问题实战策略》——chaper9——动态规划法技巧

    Q1: 数字游戏: 两个人(A.B)用n个整数排成的一排棋盘玩游戏,游戏从A开始,每个人有如下操作: (1)    拿走棋盘最右侧或者最左侧的棋子,被拿走的数字从棋盘中抹掉. (2)    棋盘中还剩 ...

  6. 《算法问题实战策略》-chaper8-动态规划法

    Q1:偶尔在电视上看到一些被称为“神童”的孩子们背诵小数点以后几万位的圆周率.背诵这么长的数字,可利用分割数字的方法.我们用这种方法将数字按照位数不等的大小分割后再背诵. 分割形式如下: 所有数字都相 ...

  7. 《算法问题实战策略》-chaper21-树的实现和遍历

    这一章节开始介绍一个数据结构中的一个基本概念——树. 我们从数据结构的解读来解释树结构的重要性,现实世界的数据除了最基本的线性结构(我们常用队列.数组和链表等结构表征),还有一个重要的特性——层级结构 ...

  8. 算法问题实战策略 QUADTREE

    地址 https://algospot.com/judge/problem/read/QUADTREE 将压缩字符串还原后翻转再次压缩的朴素做法 在数据量庞大的情况下是不可取的 所以需要在压缩的情况下 ...

  9. 算法问题实战策略 DICTIONARY

    地址 https://algospot.com/judge/problem/read/DICTIONARY 解法 构造一个26字母的有向图 判断无回路后 就可以输出判断出来的字符序了 比较各个字母的先 ...

随机推荐

  1. C# -- Quartz.Net入门案例

    1. 入门案例 using Quartz;using Quartz.Impl; public class PrintTime : IJob { public Task Execute(IJobExec ...

  2. 字节跳动——IT技术工程师面试题

    .自我介绍 .项目介绍 .争对个人项目进行提问 .场景模拟 .1如何知道用户的指定视频(类似于QQ发视频)的服务是正常的 .使用appum进行自动化测试 .使用bat脚本获取进程状态,然后定时发送em ...

  3. SpringCloud服务配置中心

    SpringCloud Config简介 Spring Cloud Config 是 Spring Cloud 团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持 ...

  4. Java生鲜电商平台-生鲜系统中微服务架构设计与分析实战

    Java生鲜电商平台-生鲜系统中微服务架构设计与分析实战 说明: Java生鲜系统中微服务的拆分应该如何架构设计与分析呢?以下是我的实战中的设计与经验分析. 目录 1. 微服务简介2. 当前现状3. ...

  5. JDK新特性关于流操作部分

    // array 工具类 可以用来快捷的将数组转化为list List<String> strings = Arrays.asList("zhongguo", &quo ...

  6. js-01-基础知识

    一.JS变量的声明.数据类型和变量的转换 1.js变量声明关键字:var 注意:a:js变量区分大小写: b:js中字符串可使用双引号,也可使用单引号: c:js中可声明同名变量,控制台不会报错,但后 ...

  7. Android使用ActivityLifecycleCallbacks管理Activity和区分App前后台

    一.ActivityLifecycleCallbacks接口介绍 官方地址:https://developer.android.com/reference/android/app/Applicatio ...

  8. 一次在CentOS系统单用户模式下使用passwd命令破密失败的案例

    某次遇到需要进入系统的单用户模式进行破密操作,结果却显示如下: 根据提示:Permission denied(缺少权限) 此时查看/usr/bin/passwd 权限: 正常情况下的权限应该是如下: ...

  9. docker工具之基本命令

    docker工具之基本命令 1.docker服务的启动.停止.重启 systemctl start docker #启动docker服务 systemctl daemon-reload #守护进程重启 ...

  10. Redis令牌桶限流

    一 .场景描述 在开发接口服务器的过程中,为了防止客户端对于接口的滥用,保护服务器的资源, 通常来说我们会对于服务器上的各种接口进行调用次数的限制.比如对于某个 用户,他在一个时间段(interval ...