《算法问题实战策略》 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字母的有向图 判断无回路后 就可以输出判断出来的字符序了 比较各个字母的先 ...
随机推荐
- NETGEAR R7800路由器TFTP刷回原厂固件方法
前几天因图新鲜将用了一年的R7800刷为dd-wrt固件,结果发现信号覆盖和网络速率相对于原厂固件还有一些差距. 然后从dd-wrt固件刷回原厂,具体操作过程如下: 1.到NETGEAR官网[支持]模 ...
- 有抱负的 DevOps 和 SRE 工程师必读好书清单 | 文末有福利!
原文地址:https://medium.com/faun/10-great-books-for-aspiring-devops-sre-engineers-76536c7c4909 原文作者:Ayme ...
- 推荐一个好用的行内可编辑的table组件 vxe-table
项目中有一个需要用户点击table单元格可编辑的需求,由于博主用的是elementUI,element组件内实现可编辑,用过的小伙伴都知道,非常麻烦,后来博主在浏览组件的时候发现了 一款非常好用的ta ...
- orm终极大爆炸
orm终极 甩一个代码给你 # 创建字段 class Field: def __init__(self, name, column_type, primary_key, default): self. ...
- docker下MySQL的主从复制
MySql的主从复制 sudo docker pull MySQL:5.7 拉取MySQL的镜像文件(版本号为 5.7) sudo docker run -p 3339:3306 --name mas ...
- openstack_dashboard无法获取nova
问题描述: 今天打开openstack的dashboard准备创建实例,结果计算节点每一项展开都无法获取nova 之前已经把nova搞好了并没有什么问题,怎么突然就服务也起不了了 查看了一下nova服 ...
- android 启动流程 相关2 init进程 属性服务
Init属性服务 系统属性服务 属性梳理 来源和读取时机 来源:内核参数 ro.kernel.* 代表有qemu内核参数才会设置(在虚拟机中) ro.boot.* 1.内核设备树相关的设备 ...
- Educational Codeforces Round 77 (Rated for Div. 2)
A: 尽可能平均然后剩下的平摊 #include <bits/stdc++.h> using namespace std; typedef long long ll; const int ...
- 【洛谷5644】[PKUWC2018] 猎人杀(容斥+生成函数+分治NTT)
点此看题面 大致题意: 有\(n\)个人相互开枪,每个人有一个仇恨度\(a_i\),每个人死后会开枪再打死另一个还活着的人,且第一枪由你打响.设当前剩余人仇恨度总和为\(k\),则每个人被打中的概率为 ...
- [译]OpenSSL Cookbook
记录个人学习过程吧,顺便翻译一下.另外,本文并不会包括原连接中的所有内容,仅包括个人在工作中会经常遇到的. 参考:OpenSSL Cookbook 前言 由于协议特性和实现的复杂性,有时很难确定安全服 ...