传送门(<--可以点击的)

时间限制(普通/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: 单词串串烧(回溯)的更多相关文章

  1. Leetcode题目79.单词搜索(回溯+DFS-中等)

    题目描述: 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许 ...

  2. [LeetCode] 79. 单词搜索(DFS,回溯)

    题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个单元格 ...

  3. leetcode 面试题 17.22. 单词转换(DFS+回溯)

    题目描述 思路分析 这题回溯,先想出它的空间解是什么,这里空间解,其实就是给的原字符串到结束字符串中间的变形过程,那么就可以容易的画出一个解空间树,用深度搜索进行搜索, 剪枝后,进入下一个维度,再进行 ...

  4. Java的哪些事

    Java的哪些事--------------------------------------------------Java学习分2个方面: Java语法与Java类库 Java: A simple, ...

  5. K:正则表达式之进阶

    子表达式: 前面所介绍的关于重复匹配的知识,其重复匹配的字符只作用于紧挨着的前一个字符而言,而有时候要将一个集体(姑且用该概念进行称呼)进行重复多遍的进行匹配,则使用前面所介绍的知识,其是无法做到的. ...

  6. Atitit.词法分析的理论原理 part2

    Atitit.词法分析的理论原理 part2 1.  转换图1 1.1. 转换图是由程序流程图改进而成的.同样,转换图也可以等价地转换为程序流程图3 1.2. 2.2.3  构造词法分析器(2)流程程 ...

  7. JavaScript this 的指向问题

    原文作者:SegmentFault ——写bug 原文链接:https://segmentfault.com/a/1190000015438195 this的指向已经是一个老生常谈的问题,每逢面试都要 ...

  8. P1019 单词接龙 字符串回溯

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

  9. Leetcode之回溯法专题-212. 单词搜索 II(Word Search II)

    Leetcode之回溯法专题-212. 单词搜索 II(Word Search II) 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单 ...

随机推荐

  1. java 常用第3方工具

    https://www.cnblogs.com/chenpi/p/5608628.html#_label4

  2. 机器学习入门-数值特征-对数据进行log变化

    对于一些标签和特征来说,分布不一定符合正态分布,而在实际的运算过程中则需要数据能够符合正态分布 因此我们需要对特征进行log变化,使得数据在一定程度上可以符合正态分布 进行log变化,就是对数据使用n ...

  3. Redis-Desktop-Manager的下载与使用

    redis可视化工具 参考 https://blog.csdn.net/Future_LL/article/details/84591057

  4. JSdom操作内容,样式,属性

    <p> JavaScript 能够直接写入 HTML 输出流中: </p> <script> document.write("<h1>This ...

  5. git安装与基本命令

    一.前言 GibHub的名字源于Git,Git是一个分布式版本控制系统,让程序员团队能够协作开发项目,Git帮助大家管理为项目所做的工作,避免一个人所做的修改影响其他人所做的修改.你在项目中实现一个新 ...

  6. LeetCode题解 Permutations II 和 Permutations I ——回溯算法

    这个算法感觉还是很陌生的.算法导论里没有讲这个算法,而数据结构与算法分析只用了一节来阐述.我居然跳过去了..尴尬. 笨方法解决的: 第一题: 给定一个元素不重复的数组,枚举出他们的全排列. 方法1:递 ...

  7. js判断网页是否加载完毕

    1. document.onreadystatechange = function () { if(document.readyState=="complete") { docum ...

  8. MySQL5.7 并行复制配置

    转自:https://www.cnblogs.com/langdashu/p/6125621.html [MySQL] 号称永久解决了复制延迟问题的并行复制,MySQL5.7 一.缘由: 某天看到主从 ...

  9. python使用xlrd 操作Excel读写

    此文章非本人 一.安装xlrd模块 到python官网下载http://pypi.python.org/pypi/xlrd模块安装,前提是已经安装了python 环境. 二.使用介绍 1.导入模块 i ...

  10. 最邻近算法(KNN)识别数字验证码

    应用场景   对于简单的数字型验证码的自动识别.前期已经完成的工作是通过切割将验证码图片切割成一个一个的单个数字的图片,并按照对应的数字表征类别进行分类(即哪些图片表示数字7,哪些表示8),将各种数字 ...