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,找出所有同时在二维网格和字典中出现的单词. 单 ...
随机推荐
- leetcode1022
class Solution(object): def __init__(self): self.li = list() self.sums = 0 def Trace(self,root): if ...
- tp5增删改查
tp5框架增删改查,相对于以前的源生代码而言,非常简单,主要是为了熟练的应用框架,下面的代码主要是tp5框架的增删改查,让我们的更好 掌握框架. <?php namespace app\inde ...
- category,extension区别
extension是在编译的时候就决定了的,跟普通的头文件是一样的,所以可以添加属性.实例变量.方法.并且添加extension的前提是你有这个类的源代码. category是在程序运行的时候才决定的 ...
- join和子查询的一点点思考
代码和表设计过程中,为了考虑数据库的范式,通常导致需要join多张表或子查询, 如报表场景, 可此种方式在大数据量的 情况下,效率较低. 如果能做适量的数据冗余,便可以减少join或子查询,效率较高 ...
- SecureCRT使用本地公钥 SSH 免密码登录Linux
其原理与Linux系统之间的SSH通道原理是一样的 下文中如果创建公钥的格式是:标准公钥和VanDyke私钥格式,需要用ssh-keygen -i -f 转换.如果是OpenSSH密钥格式可直接修改文 ...
- 拓展Scene视图——场景编辑Vector2/3
Test.cs using System.Collections; using System.Collections.Generic; using UnityEngine; public class ...
- JDBC是如何执行SQL脚本的
(1) 加载JDBC驱动程序: Cllass.forName(" 驱动程序" ); //你要连接的数据库对象 (2) 建立连接 Connection conn=DriverMa ...
- [PHP]json_encode增加options参数后支持中文
---------------------------------------------------------------------------------------------------- ...
- RxJava2.0学习笔记2 2018年7月3日 周二
摘记: 1.map -- 转换 有些服务端的接口设计,会在返回的数据外层包裹一些额外信息,这些信息对于调试很有用,但本地显示是用不到的.使用 map() 可以把外层的格式剥掉,只留下本地会用到的核心 ...
- 混合app开发,h5页面调用ios原生APP的接口
混合APP开发中,前端开发H5页面,不免会把兼容性拉进来,在做页面的兼容性同事,会与原生app产生一些数据交互: 混合APP开发,安卓的兼容性倒是好说,安卓使用是chrome浏览器核心,已经很好兼容H ...