TOJ3112: 单词串串烧(回溯)
传送门(<--可以点击的)
时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte
描述
“单词串串烧”是一款拼词智力游戏,给定4*4的方格,随机取16个大写字母置于16个方格之中,玩家从任意一个方格出发,从一个字母沿相邻(上、下、左、右,左上、左下、右上、右下8个方向都算相邻)方格可以找到另一字母,将这些字母串联起来可以组成许多不同的单词。现在的问题是先给出一个单词,需要你开动脑筋写一个程序来判断是否能够从这些方格中的字母拼出给定的单词,但要注意:在同一个单词中任何一个方格只能使用1次。
比如:
P R G N
G O E I
R S M Y
A M E D
可以拼出“PROGRAMMING”、“SOME”、“RED”,但不能拼出“PROGRAMMER”,因为最后一个R重复使用了。
输入
输入数据有多组,每组数据的第1行为一个由大写字母组成的单词,不超过16个字母。接下来有4行,每行4个大写字母,组成4*4的方格。输入数据以EOF结束。
输出
对每组输入数据,判断是否可以拼出该单词,如果可以输出yes,否则输出no。
样例输入
PROGRAMMING
PRGN
GOEI
RSMY
AMED
ROSEMARY
AMED
RSMY
GOEI
PRGN
样例输出
yes
no
思路:简单回溯题,记录一下第一个字符出现的位置,然后深搜找就行。
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string.h>
#include<string>
#include<cstdlib>
#include<cmath>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<vector>
#define ll long long
using namespace std;
int go[][]={{-,},{,},{,-},{,},{,},{,-},{-,},{-,-}};
char ma[][];
bool check(int x,int y){
if(x < || x >= || y < || y >= ){
return false;
}
return true;
}//判断是否越界
int vis[][],f;
void dfs(int x,int y,string cmp,string now){
vis[x][y] = ;
if(now.size()+ ==cmp.size())
f = ;
for(int i = ; i < ; i++){
int dx = x + go[i][];
int dy = y + go[i][];
if(!vis[dx][dy] && check(dx,dy) && ma[dx][dy] == cmp[now.size()+]){
vis[dx][dy] = ;
dfs(dx,dy,cmp,now+ma[dx][dy]);
vis[dx][dy] = ;//回溯思想
}
}
}
int main(){
string cmp;
while(cin>>cmp){
int ex[],ey[],k = ;
//这里我用ex ey数组存出现第一个字符的横纵坐标,作为深搜的起点。
for(int i = ; i < ; i++){
scanf("%s",ma[i]);
for(int j = ; j < ;j++){
if(ma[i][j] == cmp[]){
ex[k] = i;
ey[k++] = j;
}
}//记录出现第一个字符的横纵坐标
}
f = ;//记录是否已经找到
for(int i = ; i < k ; i++){
memset(vis,,sizeof(vis));//每次清空vis数组
dfs(ex[i],ey[i],cmp,"");//分别代表 进入深搜的横纵坐标,需要匹配的串,以及空串。
if(f)break;
}
f?puts("yes"):puts("no");
}
}
TOJ3112: 单词串串烧(回溯)的更多相关文章
- Leetcode题目79.单词搜索(回溯+DFS-中等)
题目描述: 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许 ...
- [LeetCode] 79. 单词搜索(DFS,回溯)
题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格 ...
- leetcode 面试题 17.22. 单词转换(DFS+回溯)
题目描述 思路分析 这题回溯,先想出它的空间解是什么,这里空间解,其实就是给的原字符串到结束字符串中间的变形过程,那么就可以容易的画出一个解空间树,用深度搜索进行搜索, 剪枝后,进入下一个维度,再进行 ...
- Java的哪些事
Java的哪些事--------------------------------------------------Java学习分2个方面: Java语法与Java类库 Java: A simple, ...
- K:正则表达式之进阶
子表达式: 前面所介绍的关于重复匹配的知识,其重复匹配的字符只作用于紧挨着的前一个字符而言,而有时候要将一个集体(姑且用该概念进行称呼)进行重复多遍的进行匹配,则使用前面所介绍的知识,其是无法做到的. ...
- Atitit.词法分析的理论原理 part2
Atitit.词法分析的理论原理 part2 1. 转换图1 1.1. 转换图是由程序流程图改进而成的.同样,转换图也可以等价地转换为程序流程图3 1.2. 2.2.3 构造词法分析器(2)流程程 ...
- JavaScript this 的指向问题
原文作者:SegmentFault ——写bug 原文链接:https://segmentfault.com/a/1190000015438195 this的指向已经是一个老生常谈的问题,每逢面试都要 ...
- P1019 单词接龙 字符串回溯
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...
- Leetcode之回溯法专题-212. 单词搜索 II(Word Search II)
Leetcode之回溯法专题-212. 单词搜索 II(Word Search II) 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单 ...
随机推荐
- 【ASP.NET 插件】分享一个可视化HTML编辑器 CKEditor.NET
因为公司网站的可视化HTML编辑器IE兼容性问题,js报错不能使用,于是在网上找到了个还行的,图片本地上传的话直接把图片拖到编辑窗口就可以了.这个编辑器是在开源中国看到的,个人觉得还不错! CKEdi ...
- linux驱动开发(四) 字符设备驱动框架(自动创建设备节点)
代码如下 #include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> # ...
- golang redis集群操作:redis-go-cluster
背景 感觉redis-cli desktop及其难用,最近用golang做了个redis查询工具,支持单例和集群操作,终于不再卡顿!!! 用到的包 "github.com/garyburd/ ...
- mysqldump: Got error: 1066: Not unique table/alias
mysqldump: Got error: 1066: Not unique table/alias myql 导出时提示如下: [root@localhost mysql]# mysqldump ...
- 笨方法学python 22,前期知识点总结
对笨方法学python,前22讲自己的模糊的单词.函数进行梳理总结如下: 单词.函数 含义 print() 打印内容到屏幕 IDLE 是一个纯Python下自带的简洁的集成开发环境 variable ...
- jquery接触初级-----juqery选择器实例
jquery 选择器用于触发事件,可以少写很多js代码,一般来说,基本的特效功能都能够完成 这里列举一个简单的jquery写的例子: 要求:有两种情况: 1.产品最初状态显示简约形式的品牌,即显示部分 ...
- css:清楚浮动
这个清楚浮动的方法最常用,给浮动字元素的父盒子,也就是不浮动元素,添加一个lhearfix的类,其类的css样式为: .clearfix:after{ /*必须要写这三句话*/ content:''; ...
- data型怎么转换格式
data型如何转换格式01-1月 -03 如何转成 YYYY-MM-DD 的格式 本来就是date了 ------解决方案--------------------to_char ...
- Linux删除ORACLE数据库用户失败提示ORA-01940解决方法
操作环境 SuSE11+Oracle11gR2 问题现象 删除ORACLE数据库用户失败,提示ORA-01940: cannot drop a user that is currently conne ...
- avalon2学习教程02之vm
avalon2的vm是一个非常重要的东西,其设计原型最初脱胎于knockout.js,但到avalon1.6中,终于寻得自己的方案,更精简,更易用,更魔幻. vm是一种特殊的数据结构,看起来像普通对象 ...