1、 单词接龙

https://www.luogu.org/problemnew/show/P1019

题目描述

单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如 beastbeast和astonishastonish,如果接成一条龙则变为beastonishbeastonish,另外相邻的两部分不能存在包含关系,例如atat 和 atideatide 间不能相连。

输入输出格式

输入格式:

输入的第一行为一个单独的整数nn (n \le 20n≤20)表示单词数,以下nn 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。你可以假定以此字母开头的“龙”一定存在.

输出格式:

只需输出以此字母开头的最长的“龙”的长度。

输入输出样例

输入样例#1:

5
at
touch
cheat
choose
tact
a
输出样例#1:

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小练的更多相关文章

  1. dfs小练 【dfs】

    1.前n个自然数的所有排列: #include <iostream> #include <cstdio> #include <cstring> using name ...

  2. js 计时器小练-20160601

    今天要做一个计时器小练,所以我就做了练习,代码如下. // 初始化时间,以及定义全局量去接收计时器 var timer = 0; var t; var h, min, sec, millisec; / ...

  3. 【Python】【辅助程序】练手小程序:记录外网动态IP地址

    练手小程序 程序作用:对IP实时记录: 1.定时获取外网IP,存储在本地文件中: 编写思路: 1)收集获取外网的API接口       http://bbs.125.la/thread-1383897 ...

  4. 【Python精华】100个Python练手小程序

    100个Python练手小程序,学习python的很好的资料,覆盖了python中的每一部分,可以边学习边练习,更容易掌握python. [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同 ...

  5. 整理了适合新手的20个Python练手小程序

    100个Python练手小程序,学习python的很好的资料,覆盖了python中的每一部分,可以边学习边练习,更容易掌握python. 本文附带基础视频教程:私信回复[基础]就可以获取的 [程序1] ...

  6. 算法小练#1 - Dany Yang

    开始记录每周做过的算法题,这是第一周,新的开始 1021. 删除最外层的括号 题目要求如下: 有效括号字符串为空 ("")."(" + A + ")& ...

  7. 初始Spring MVC——练手小项目

    初始Spring MVC 前几天开始了我的spring学习之旅,由于之前使用过MVC模式来做项目,所以我先下手的是 Spring MVC,做个练手项目,非常简单 项目介绍: 用户输入信息 -> ...

  8. java算法题每日一练01,java入门简单算法题小练

    1.给数组做反序 public class Ak01 { public static void main(String[] args) { int[] a = new int[]{22,48,41,2 ...

  9. 8.1搜索专练DFS和BFS

    这是第一次全部做出来的依次练习了,有一些都是做过两遍了的,但是还是错了几回,更多时候我还是应该多注意下细节,就好像章爷笑我 的一样,像什么vis[]标记没清0,什么格式错误,还有什么题目没看清,还是的 ...

随机推荐

  1. Java中类的线程安全问题

    java中各种集合(字符串类)的线程安全性!!! 一.概念: 线程安全:就是当多线程访问时,采用了加锁的机制:即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读 ...

  2. 使用commons-pool2实现FTP连接池

    ​ GitHub : https://github.com/jayknoxqu/ftp-pool 一. 连接池概述 ​ 频繁的建立和关闭连接,会极大的降低系统的性能,而连接池会在初始化的时候会创建一定 ...

  3. .net解决Xss攻击

    首先要明白什么是Xss攻击 XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中.比如这些代码包括HTML代码和客户端脚本.攻击者利用XSS漏 ...

  4. C#里面的事物回滚,解决同步数据插入时出现重复数据

    什么是事物回滚: 举个栗子,你在你家的银行分行取钱,取完钱数据要同步,而且可能每个分行都有一个存储这些数据的数据库,分行的这些 存取的记录都需要实时同步,如果你取完500刚好断电了,好嘛,分行可能刚记 ...

  5. EF CodeFirst(四) 关系

    数据库表之间有一对一  一对多 多对多关系.那同样,CodeFirst也要能分析这些类之间的这些关系. CodeFirst可以自动通过分析类之间的属性导航属性 从而得出类之间的关系,自动确定外键. 一 ...

  6. Linux常用基本命令(head)

    head命令 作用:显示文件的头部内容,默认显示前面10行 格式: head [option] [file] -n <行数> -c <字节> ghostwu@dev:~/lin ...

  7. LeetCode DB: Department Highest Salary

    The Employee table holds all employees. Every employee has an Id, a salary, and there is also a colu ...

  8. B2C,C2B,B2B,C2C,O2O,O2P

    B2C: 全称:Business-to-Customer 解释:商家对终端用户.通常说的商业零售,直接面向消费者销售产品和服务. C2B: 全称:customer to business 解释:终端用 ...

  9. 【读书笔记】iOS-网络-使用Game Kit实现设备间通信

    Apple的Game Kit框架可以实现没有网络状况下的设备与设备之间的通信,这包括没有蜂窝服务,无法访问Wi-Fi基础设施以及无法访问局域网或Internet等情况.比如在丛林深处,高速公路上或是建 ...

  10. 转 .md即markdown文件的基本常用编写语法(图文并茂)

    原文链接:.md即markdown文件的基本常用编写语法(图文并茂) 序言: 很久没有写博客了,感觉只要是不写博客,人就很变得很懒,学的知识点感觉还是记不住,渐渐地让我明白,看的越多,懂的越少(你这话 ...