随手练——DFS小练
1、 单词接龙
https://www.luogu.org/problemnew/show/P1019
题目描述
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beastbeast和astonishastonish,如果接成一条龙则变为beastonishbeastonish,另外相邻的两部分不能存在包含关系,例如atat 和 atideatide 间不能相连。
输入输出格式
输入格式:
输入的第一行为一个单独的整数nn (n \le 20n≤20)表示单词数,以下nn 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.
输出格式:
只需输出以此字母开头的最长的“龙”的长度。
输入输出样例
5 at touch cheat choose tact a
23
核心函数:
计算两个字符串的尾首公共部分长度,不存在返回0
int splice(string s1, string s2) { , j = ; string help1, help2; && j < s2.length() - ) { help1.insert(, , s1[i]); help2.append(, s2[j]); ) return help1.length(); i--; j++; } ; }
完整代码:
#include <iostream> #include <string> #include <algorithm> #include <vector> #include <map> using namespace std; ; vector<string>v; ]; int splice(string s1, string s2) { , j = ; string help1, help2; && j < s2.length() - ) { help1.insert(, , s1[i]); help2.append(, s2[j]); ) return help1.length(); i--; j++; } ; } void DFS(string help) { bool flag = true;//标记,当本层递归没有一个字符串可以往后加时,退出 ; i < v.size(); i++) { int cnt = splice(help, v[i]); && cnt != ) { flag = false; use[i]++; string t = help; DFS(help.append(v[i].substr(cnt))); help = t; use[i]--; } } if (flag) { if (help.length() > maxcnt)maxcnt = help.length(); return; } } int main() { int n; string s; cin >> n; while (n--) { cin >> s; v.push_back(s); } char head; cin >> head; ; i < v.size(); i++) { ] == head) { //不确定是否只有一个龙头 use[i]++; DFS(v[i]); use[i]--; } } cout << maxcnt << endl; ; }
2、单词方阵
https://www.luogu.org/problemnew/show/P1101
给一个n×n的字母方阵,内可能蕴含多个“yizhong
”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 8 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用*
代替,以突出显示单词。例如:
输入:
8 输出:
qyizhong *yizhong
gydthkjy gy******
nwidghji n*i*****
orbzsfgz o**z****
hhgrhwth h***h***
zzzzzozo z****o**
iwdfrgng i*****n*
yyyygggg y******g
每碰到一个'y',八向搜索。如果满足该方向的条件就递归,否则结束递归。用数组保存递归路径。
#include <iostream> #include <string> #include <algorithm> #include <vector> #include <map> using namespace std; string standard = "yizhong"; int n; ][]; //上,下,左,右,左上,左下,右上,右下 //每个方向x,y的增量 ][] = { {-,},{,},{,-}, {,},{-,-},{,-},{-,},{,} }; ][]; //记录下路径 ][]; void DFS(int x, int y, int k,int dir) { || x == n || y < || y == n)return; if (k == standard.length()) { ; i < ; i++) { res[path[i][]][path[i][]] = standard[i]; } return; } ]][y + direction[dir][]] == standard[k]) { path[k][] = x + direction[dir][]; path[k][] = y + direction[dir][]; DFS(x + direction[dir][], y + direction[dir][], k + , dir); } } int main() { cin >> n; ; i < n; i++) { ; j < n; j++) { cin >> m[i][j]; } } ; x < n; x++) { ; y < n; y++) { if (m[x][y] == 'y') { ; i < ; i++) { path[][] = x; path[][] = y; DFS(x, y, , i); } } } } ; x < n; x++) { ; y < n; y++) { ) cout << res[x][y]; else cout << '*'; } cout << endl; } ; }
3、迷宫
https://www.luogu.org/problemnew/show/P1605
#include <iostream> using namespace std; //上下左右 ][] = { {-,},{,},{,-},{,} }; ][]; int N, M, T, cnt; int SX, SY, EX, EY; void DFS(int x, int y) { || x>N || y < || y > M) return; if (x == EX && y == EY) { cnt++; return; } ; i < ; i++) { ]][y + direction[i][]] != ) { m[x + direction[i][]][y + direction[i][]] = ; DFS(x + direction[i][], y + direction[i][]); m[x + direction[i][]][y + direction[i][]] = ; } } } int main() { cin >> N >> M >> T; cin >> SX >> SY >> EX >> EY; ; i < T; i++) { int x,y; cin >> x >> y; m[x][y] = ; } m[SX][SY] = ; DFS(SX, SY); cout << cnt << endl; ; }
P1162 填涂颜色
取巧一点的做法,把外面的0变成-1,就和里面的区分出来,但是外面的0一不一定是连通的,可以把所有边界走完一遍,所有是0的都进行DFS函数一次。
但是,有简单的办法,数组多开一圈,这一圈置0,那么边界0就一定是连通的了,一次DFS就行了。
#include <iostream> #include <stdio.h> using namespace std; ][]; int n; ][] = { {-,},{,},{,-},{,} }; void DFS(int x, int y, int sign) { || y < || x > n + || y > n + ) return; ; i < ; i++) { ], toy = y + dir[i][]; if (m[tox][toy] == sign) { m[tox][toy] = -; DFS(tox, toy, sign); } } } int main() { cin >> n; ; i <= n; i++) { ; j <= n; j++) { cin >> m[i][j]; } } DFS(, , ); ; i <= n; i++) { ; j <= n; j++) { )cout << << ' '; )cout << << ' '; << ' '; } cout << endl; } ; }
随手练——DFS小练的更多相关文章
- dfs小练 【dfs】
1.前n个自然数的所有排列: #include <iostream> #include <cstdio> #include <cstring> using name ...
- js 计时器小练-20160601
今天要做一个计时器小练,所以我就做了练习,代码如下. // 初始化时间,以及定义全局量去接收计时器 var timer = 0; var t; var h, min, sec, millisec; / ...
- 【Python】【辅助程序】练手小程序:记录外网动态IP地址
练手小程序 程序作用:对IP实时记录: 1.定时获取外网IP,存储在本地文件中: 编写思路: 1)收集获取外网的API接口 http://bbs.125.la/thread-1383897 ...
- 【Python精华】100个Python练手小程序
100个Python练手小程序,学习python的很好的资料,覆盖了python中的每一部分,可以边学习边练习,更容易掌握python. [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同 ...
- 整理了适合新手的20个Python练手小程序
100个Python练手小程序,学习python的很好的资料,覆盖了python中的每一部分,可以边学习边练习,更容易掌握python. 本文附带基础视频教程:私信回复[基础]就可以获取的 [程序1] ...
- 算法小练#1 - Dany Yang
开始记录每周做过的算法题,这是第一周,新的开始 1021. 删除最外层的括号 题目要求如下: 有效括号字符串为空 ("")."(" + A + ")& ...
- 初始Spring MVC——练手小项目
初始Spring MVC 前几天开始了我的spring学习之旅,由于之前使用过MVC模式来做项目,所以我先下手的是 Spring MVC,做个练手项目,非常简单 项目介绍: 用户输入信息 -> ...
- java算法题每日一练01,java入门简单算法题小练
1.给数组做反序 public class Ak01 { public static void main(String[] args) { int[] a = new int[]{22,48,41,2 ...
- 8.1搜索专练DFS和BFS
这是第一次全部做出来的依次练习了,有一些都是做过两遍了的,但是还是错了几回,更多时候我还是应该多注意下细节,就好像章爷笑我 的一样,像什么vis[]标记没清0,什么格式错误,还有什么题目没看清,还是的 ...
随机推荐
- CSS学习笔记02 CSS选择器
1.通配符选择器 通配符选择器用“*"号表示,是所有选择器中作用范围最广的,能匹配页面中所有的元素 /*设置当前页面中所有标签的颜色为红色*/ * { color: red; } 2.标签选 ...
- TCP Socket Http关系
理解Tomcat内部处理网络数据的机制同时需要了解相关的一些术语,这样我们在阅读源码的时候能更加清楚的理解Connector下使用到的Socket通信原理. TCP/IP: 数据在网络传输是基于TCP ...
- PDO中的事务处理
基本原理和步骤其实都是一样的(可参看上一篇“MySQL的事务处理”),PDO中的事务处理就是调用PDO对象的三个方法: 开启事务:beginTransaction 回滚操作:rollBack 执行操作 ...
- python并发编程-线程和锁
什么是线程 进程:资源分配单位 线程:cpu执行单位(实体),每一个py文件中就是一个进程,一个进程中至少有一个线程 线程的两种创建方式: from multiprocessing import Pr ...
- js-ES6学习笔记-Class(2)
1.与函数一样,类也可以使用表达式的形式定义. const MyClass = class Me { getClassName() { return Me.name; } }; 这个类的名字是MyCl ...
- mongodb基础环境搭建
一.准备工具 (1)mongodb(https://www.mongodb.com/dr/fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus- ...
- Oracle中Database Link的创建和Synonyms
在工作中我遇到过这样的一个问题,就是当我需要将远程主机上Oracle数据中某个表的数据copy到本地Oracle时,有多种方法可以实现.1.将所需要的数据导出到csv或其他格式的文档,复制到本地进行直 ...
- Windows7安装 nginx+php 后访问.php文件出现 “No input file specified.” 的解决办法
在Windows7上安装了Nginx+PHP,参考教程为 https://www.cnblogs.com/anlia/p/5916758.html 启动 nginx 后,在浏览器中输入localhos ...
- Impala随手记
最近开始使用Impala,基本完全兼容传统SQL,并且查询速度飞快,是Hive的良好替代: 1.登录及简单查询 impala-shell #列出数据库 show databases; #载入数据库 u ...
- [Android] 锁定屏幕
最近玩的比较欢脱,欠了好多东西没写.今天先简单地补一篇简单的内容.就是最近涉及到一个锁定Android设备屏幕的设计,大概就是通过一个按钮或者服务消息,来控制设备界面完全锁定,不能点击任何东西.感觉上 ...