《算法问题实战策略》 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字母的有向图 判断无回路后 就可以输出判断出来的字符序了 比较各个字母的先 ...
随机推荐
- Hive DDL、DML操作
• 一.DDL操作(数据定义语言)包括:Create.Alter.Show.Drop等. • create database- 创建新数据库 • alter database - 修改数据库 • dr ...
- 邬江兴院士:工业互联网安全&拟态防御
尊敬的郑院士.曹书记.张秘书长,各位学术界的同仁们,很高兴在第一届工业互联网学术专题论坛上发言.我今天想谈的问题是工业互联网,这个概念很热,前景也很美好,很诱人.但是我认为工业互联网的安全挑战更严峻, ...
- 完全卸载Android Studio(卸载得干干净净)
步骤其实很简单,一共三步,但是每一步都需要完成,步骤如下: 打开控制面板或腾讯软件管家等执行常规的卸载操作. 找到SDK的安装目录手动删除SDK. 进入“C:\Users\<你的用户名下> ...
- A:mysql数据库章节导航
mysql数据库章节导航 mysql5.7的安装(yum和二进制安装) 数据库的基本操作 索引 权限管理 日志管理 逻辑备份mysqldump 物理备份:xtrabackup 主从复制-传统方式 主从 ...
- vue 路由对象
路由对象在使用了 vue-router 的应用中,路由对象会被注入每个组件中,赋值为 this.$route ,并且当路由切换时,路由对象会被更新. so , 路由对象暴露了以下属性: 1.$rout ...
- 2019阿里天猫团队Java高级工程师面试题之第二面
2019阿里天猫团队Java高级工程师面试题之第一面 2019阿里天猫团队Java高级工程师面试题之第三面 1.Tomcat的基本架构是什么? https://blog.csdn.net/xlgen1 ...
- 转载-Archunit的使用
Archunit的使用 注:开发的编辑器: Intellij Idea,JDK版本是JDK8 Archunit是什么,官网的英文介绍很好,建议阅读原文,"ArchUnit is a ...
- ubuntu上编译和使用easy_profiler对C++程序进行性能分析
本文首发于个人博客https://kezunlin.me/post/91b7cf13/,欢迎阅读最新内容! tutorial to compile and use esay profiler with ...
- ASP.NET 页面控制
一.HTTPRequest对象封装客户端请求页面或提交表单时提供的信息 请求方法:get/post 参数名/值 Cookie 使用的语言二.Rquest对象常用方法与属性 属性: QueryStrin ...
- 配置, 映射WebDAV, 并通过IIS网站访问
服务端 0. 服务端安装IIS时, 选中WebDAV发布, Windows身份验证, 安装完毕后, 打开IIS管理器(inetmgr); 1. 新建网站或使用默认网站, 创建虚拟目录, 虚拟目录物理路 ...