总结2..

发布于:2025-02-10 ⋅ 阅读:(43) ⋅ 点赞:(0)

 #include <stdio.h>

#include <string.h>

// n 用于存储输入的字符串的数量

// ans 用于记录最终得到的最大长度结果,初始化为 0

int n, ans = 0;

// a 是一个二维字符数组,用于存储输入的 n 个字符串,最多可存储 30 个长度为 100 的字符串

char a[30][100];

// b 是一个整型数组,用于记录每个字符串的使用次数,这里限制每个字符串最多使用 2 次

int b[30];

 

// dfs 函数用于深度优先搜索,寻找字符串拼接后的最大长度

// x 是当前已经拼接好的字符串

// s 是当前已经拼接的字符串的总长度

void dfs(char x[], int s) {

    // 如果当前拼接的长度 s 大于已知的最大长度 ans,则更新 ans

    if (s > ans) ans = s;

    // 遍历所有的 n 个字符串

    for (int i = 0; i < n; i++) {

        // p 用于记录当前尝试匹配的前缀长度,初始化为 1

        int p = 1, flag = 0;

        // l1 是当前已拼接字符串 x 的长度

        int l1 = strlen(x);

        // l2 是当前要尝试拼接的字符串 a[i] 的长度

        int l2 = strlen(a[i]);

        // 当 p 小于 x 和 a[i] 的长度时,继续尝试匹配

        while (p < l1 && p < l2) {

            // match 用于标记当前位置是否匹配,初始化为 1(表示匹配)

            int match = 1;

            // 检查 x 的后缀和 a[i] 的前缀是否匹配

            for (int j = 0; j < p; j++) {

                // 如果不匹配,则将 match 设为 0 并跳出循环

                if (x[l1 - p + j]!= a[i][j]) {

                    match = 0;

                    break;

                }

            }

            // 如果匹配且字符串 a[i] 的使用次数小于 2

            if (match && b[i] < 2) {

                // 增加字符串 a[i] 的使用次数

                b[i]++;

                // 递归调用 dfs,将 a[i] 拼接上去,并更新长度

                dfs(a[i], s + l2 - p);

                // 递归调用结束后,减少字符串 a[i] 的使用次数,恢复现场

                b[i]--;

                // 标记已经尝试过这个字符串,跳出内层循环

                break;

            }

            // 增加匹配长度 p,继续尝试下一个位置

            p++;

        }

    }

}

 

int main() {

    // 用于临时存储输入的起始字符

    char t;

    // 读取输入的字符串数量 n

    scanf("%d", &n);

    // 读取 n 个字符串并存入数组 a 中

    for (int i = 0; i < n; i++) {

        scanf("%s", a[i]);

    }

    // 读取一个起始字符 t,注意前面的空格用于跳过之前输入的换行符

    scanf(" %c", &t);

    // 遍历所有字符串

    for (int i = 0; i < n; i++) {

        // 如果字符串 a[i] 以字符 t 开头

        if (a[i][0] == t) {

            // 增加字符串 a[i] 的使用次数

            b[i]++;

            // 从以 t 开头的字符串 a[i] 开始进行深度优先搜索

            dfs(a[i], strlen(a[i]));

            // 搜索结束后,减少字符串 a[i] 的使用次数,恢复现场

            b[i]--;

        }

    }

    // 输出最终得到的最大长度结果 ans

    printf("%d", ans);

    return 0;

}

 #include <stdio.h>

// n 用于存储输入的整数

// a 是一个数组,用于存储整数拆分后的各个部分,数组大小为 10

int n, a[10];

// dfs 函数用于深度优先搜索,对整数进行拆分

// x 表示当前还需要拆分的整数数值

// s 表示当前拆分结果数组 a 中已经存储的元素个数

void dfs(int x, int s) {

    // 如果 x 为 0,说明已经完成了一次拆分

    if (x == 0) {

        // 遍历拆分结果数组 a 中已经存储的元素,除了最后一个元素,每个元素后面输出 "+"

        for (int i = 0; i < s - 1; i++) {

            printf("%d+", a[i]);

        }

        // 输出最后一个元素,并换行

        printf("%d\n", a[s - 1]);

    }

    // 从 1 到 x 进行遍历,尝试将当前数字 i 作为拆分的一部分

    for (int i = 1; i <= x; i++) {

        // 为了保证拆分结果的有序性,要求当前数字 i 不小于前一个数字 a[s - 1]

        if (i >= a[s - 1]) {

            // 将当前数字 i 存入拆分结果数组 a 中

            a[s] = i;

            // 递归调用 dfs,继续拆分剩余的数值 x - i,同时数组中元素个数增加 1

            dfs(x - i, s + 1);

        }

    }

}

 

int main() {

    // 读取输入的整数 n

    scanf("%d", &n);

    // 从 1 到 n/2 进行遍历,将每个数作为拆分的第一个数

    for (int i = 1; i <= n / 2; i++) {

        // 将当前数 i 存入数组 a 的第一个位置

        a[0] = i;

        // 从剩余的数值 n - i 开始进行深度优先搜索,初始数组元素个数为 1

        dfs(n - i, 1);

    }

    return 0;

}

 今天做了几道搜索题,搜索题有些做的没有思路,复习了一下链表,并学习了栈和队列的使用

 


网站公告

今日签到

点亮在社区的每一天
去签到