《算法问题实战策略》 BOGGLE
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的更多相关文章
- 算法问题实战策略 PICNIC
下面是另一道搜索题目的解答过程题目是<算法问题实战策略>中的一题oj地址是韩国网站 连接比较慢 https://algospot.com/judge/problem/read/PICNIC ...
- 《算法问题实战策略》-chaper7-穷举法
关于这一章节<算法实战策略>有一段概述问题,我认为对于编程人员来说非常有价值,故在这里进行如下的摘抄: 构想算法是很艰难的工作.相比大家都经历过,面对复杂的要求只是傻乎乎地盯着显示器,或者 ...
- 《算法问题实战策略》-chaper32-网络流
基本的网络流模型: 在图论这一块初步的应用领域中,两个最常见的关注点,其一时图中的路径长度,也就是我们常说的的最短路径问题,另一个则是所谓的“流问题”. 流问题的基本概念: 首先给出一张图. 其实所谓 ...
- 《算法问题实战策略》-chaper13-数值分析
这一章节主要介绍我们在进行数值分析常用的二分.三分和一个近似求解区间积分的辛普森法. 首先介绍二分. 其实二分的思想很好理解并且笔者在之前的一些文章中也有所渗透,对于二次函数甚至单元高次函数的零点求解 ...
- 《算法问题实战策略》——chaper9——动态规划法技巧
Q1: 数字游戏: 两个人(A.B)用n个整数排成的一排棋盘玩游戏,游戏从A开始,每个人有如下操作: (1) 拿走棋盘最右侧或者最左侧的棋子,被拿走的数字从棋盘中抹掉. (2) 棋盘中还剩 ...
- 《算法问题实战策略》-chaper8-动态规划法
Q1:偶尔在电视上看到一些被称为“神童”的孩子们背诵小数点以后几万位的圆周率.背诵这么长的数字,可利用分割数字的方法.我们用这种方法将数字按照位数不等的大小分割后再背诵. 分割形式如下: 所有数字都相 ...
- 《算法问题实战策略》-chaper21-树的实现和遍历
这一章节开始介绍一个数据结构中的一个基本概念——树. 我们从数据结构的解读来解释树结构的重要性,现实世界的数据除了最基本的线性结构(我们常用队列.数组和链表等结构表征),还有一个重要的特性——层级结构 ...
- 算法问题实战策略 QUADTREE
地址 https://algospot.com/judge/problem/read/QUADTREE 将压缩字符串还原后翻转再次压缩的朴素做法 在数据量庞大的情况下是不可取的 所以需要在压缩的情况下 ...
- 算法问题实战策略 DICTIONARY
地址 https://algospot.com/judge/problem/read/DICTIONARY 解法 构造一个26字母的有向图 判断无回路后 就可以输出判断出来的字符序了 比较各个字母的先 ...
随机推荐
- CLAMP 1.0.1 Vulnhub Walkthrough
主机层面端口扫描探测: ╰─ nmap -p1-65535 -A -sV 10.10.202.137 访问web服务 使用dirbuster 加大字段进行目录爆破 http://10.10.202.1 ...
- 一文解读Redis (转)
本文由葡萄城技术团队编撰并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 引言 在Web应用发展的初期,那时关系型数据库受到了较为广泛的关注和应用,原 ...
- tensorflow 神经网络模型概览;熟悉Eager 模式;
典型神经网络模型:(图片来源:https://github.com/madalinabuzau/tensorflow-eager-tutorials) 保持更新,更多内容请关注 cnblogs.com ...
- select同时获取value和label的值
Element ui 框架型 <el-select v-model="sketchID" autocomplete="off" @@change=&quo ...
- git结合项目基本使用
学习博客:1,史上最浅显易懂的Git教程! 2,结合项目具体使用 3,常用命令快速查看 4,git stash 用法总结和注意点 一.git的工作原理和工作流程 Workspace:工作区 Index ...
- linux/kali安装及更新源以及输入法等配置
准备工作1.kali 镜像的下载,官网选择对应的版本下载https://www.kali.org/downloads/ 2.VMware的安装,同官网可下载 更新源总结#更新源gedit /etc/a ...
- Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3
A,有多个线段,求一条最短的线段长度,能过覆盖到所又线段,例如(2,4)和(5,6) 那么我们需要4 5连起来,长度为1,例如(2,10)(3,11),用(3,10) 思路:我们想一下如果题目说的是最 ...
- oracle 中 insert select 和 select insert 配合使用
Insert Into select 与 Select Into 哪个更快? 在平常数据库操作的时候,我们有时候会遇到表之间数据复制的情况,可能会用到INSERT INTO SELECT 或者 SEL ...
- Java 面试宝典!并发编程 71 道题及答案全送上!
金九银十跳槽季已经开始,作为 Java 开发者你开始刷面试题了吗?别急,我整理了71道并发相关的面试题,看这一文就够了! 1.在java中守护线程和本地线程区别? java中的线程分为两种:守护线程( ...
- redis的embstr编码
问题来了 今天在看书籍<Redis设计与实现>的时候,在8.2字符串对象里面写到 如果字符串对象保存的是一个字符串值, 并且这个字符串值的长度大于 39 字节, 那么字符串对象将使用一个简 ...