zoukankan      html  css  js  c++  java
  • 洛谷P1019【单词接龙】(DFS)

    题目链接:P1019 单词接龙

    我为这里比较难的地方就是处理两个单词的最小重叠部分,并且不允许包含关系,这里需要写一个函数来处理两个字符串的最小重叠部分。

    int getlen(char a[], char b[] )
    {
        int len1 = strlen(a), len2 = strlen(b);
        for (int i = 1; i < min(len1, len2); i++)//枚举最小重叠长度,而且保证不会让包含关系满足
        {
            bool flag = true;
            for (int j = 0; j < i; j++)
            {
                if (a[len1 - i + j] != b[j]) { //从a的末尾的第i个与b第1个开始匹配
                    flag = false;
                    break;
                }
            }
            if (flag) return i;
        }
        return 0;
    }

    这里处理完了剩下的就是搜索了

    #include<bits/stdc++.h>
    #include<unordered_map>
    using namespace std;
    const int N = 1e5 + 5;
    char word[25][N];
    int used[25];
    int n,ans;
    char start;
    int getlen(char a[], char b[] )
    {
        int len1 = strlen(a), len2 = strlen(b);
        for (int i = 1; i < min(len1, len2); i++)
        {
            bool flag = true;
            for (int j = 0; j < i; j++)
            {
                if (a[len1 - i + j] != b[j]) {
                    flag = false;
                    break;
                }
            }
            if (flag) return i;
        }
        return 0;
    }
    void dfs(int step, int len)
    {
        ans = max(ans, len);
        for (int i = 0; i < n; i++)
        {
            if (used[i] >= 2) continue;
            int len1 = getlen(word[step], word[i]);
            cout << len1 << " " << word[i]<<endl;
            if (len1)
            {
                used[i]++;
                dfs(i, len + strlen(word[i]) - len1);
                used[i]--;
            }
        }
    }
    int main()
    {
        cin >> n;
        for (int i = 0; i < n; i++)
            scanf("%s", word[i]);
        cin >> start;
        for (int i = 0; i < n; i++)
        {
            if (word[i][0] == start)
            {
                used[i]++;
                dfs(i, strlen(word[i]));
                used[i]--;
            }
        }
        cout << ans<<endl;
        return 0;
    }
  • 相关阅读:
    Maven报错,没有有效的生命周期
    6张图解释IO流
    传统Java JDBC
    快速杀死占用8080端口进程的批处理(kill-8080.bat)
    ubuntu环境配置终极解答
    Linux系统下Java开发环境的配置(未完...)
    Linux常用命令及操作(第二弹)
    Linux下安装Mysql
    Linux常用命令及操作
    int转LPCTSTR
  • 原文地址:https://www.cnblogs.com/xiaoguapi/p/10479899.html
Copyright © 2011-2022 走看看