随手练——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,什么格式错误,还有什么题目没看清,还是的 ...
随机推荐
- 【Java并发编程】8、各种锁的概念
持续更新中... 共享锁(S锁):如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁,直到已释放所有共享锁.获准共享锁的事务只能读数据,不能修改数据. 排他锁(X锁):如果事务 ...
- postgreSQL数据库的监控及数据维护
目前postgreSQL数据库的管理,数据查询等都需要安装postgreSQL软件或安装pgadmin等,远程访问都需要先登录到服务器等繁琐的操作.如果是开发团队,那么每个开发,测试,管理人员都要经历 ...
- Netty的基本概念
异步 等待它的同时你也可以做点别的事情 阻塞I/O 只能同时处理一个连接,要管理多个并发客户端,需要为每个新的客户端Socket创建一个新的Thread 使用Selector的非阻塞I/O class ...
- element ui 的Notification通知如何加 a 标签和按钮,并弹多个
前言:工作中需要在页面右下角弹出很多个提醒框,提醒框上有一个可点击的a标签,并有一个按钮,同时还需要一次性关闭所有的弹出框.转载请注明出处:https://www.cnblogs.com/yuxiao ...
- DOM(JavaScript高程笔记)
一.节点层次 1.Node类型 if (someNode.nodeType == 1){ // 适用于所有浏览器 alert("Node is an element."); } N ...
- python-桥接模式
源码地址:https://github.com/weilanhanf/PythonDesignPatterns 说明: 有些类在功能设计上要求,自身包含两个或两个以上变化的因素,即该类在二维或者多维上 ...
- CentOS 7开启防火墙端口
1.开启防火墙 systemctl start firewalld 2.添加 firewall-cmd --zone=public --add-port=80/tcp --permanent 3.重新 ...
- The D Programming Language 书评
此书的作者 Andrei Alexandrescu 作为前 C++ 社区的一朵奇葩,因为实在是不满 C++ 标准委员会的官僚作风,跳槽到了 D 社区,成为了 D 发明人 Walt Brightman ...
- Nginx的location剖析
1.location的作用: location指令的作用是根据用户的请求的URL来执行不同的应用 2.location的语法: location [ = | ~ | ~* | ^~ ] uri { . ...
- Android 编程下的 TraceView 简介及其案例实战
TraceView 是 Android 平台配备一个很好的性能分析的工具.它可以通过图形化的方式让我们了解我们要跟踪的程序的性能,并且能具体到 method.详细内容参考:Profiling with ...