Bootstrap

华为OD机试 - 考古问题 - 回溯、全排列问题(Python/JS/C/C++ 2024 C卷 200分)

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。

一、题目描述

考古问题,假设以前的石碑被打碎成了很多块,每块上面都有一个或若干个字符,请你写个程序来把之前石碑上文字可能的组合全部写出来,按升序进行排列。

二、输入描述

若干个字符。

三、输出描述

把之前石碑上文字可能的组合全部写出来,按升序进行排列。

四、测试用例

1、输入

3
a b c

2、输出

abc
acb
bac
bca
cab
cba

五、解题思路

  1. 把之前石碑上文字可能的组合全部写出来,按升序进行排列;
  2. 定义可能的组合lists;
  3. 通过回溯寻找符合要求的字符串,参数为若干个字符arr、字符是否使用过used、遍历到第j个字符、使用了的字母deque);

六、Python算法源码

import sys

def dfs(arr, used, path, result):
    if len(path) == len(arr):
        result.append(''.join(path))
        return
    for i in range(len(arr)):
        if used[i]:
            continue
        if i > 0 and arr[i] == arr[i - 1] and not used[i - 1]:
            continue
        used[i] = True
        path.append(arr[i])
        dfs(arr, used, path, result)
        path.pop()
        used[i] = False

def main():
    # 读取输入
    n = int(sys.stdin.readline())
    arr = sys.stdin.readline().strip().split()
    arr.sort()
    used = [False] * n
    result = []
    dfs(arr, used, [], result)
    # 输出结果
    for perm in result:
        print(perm)

if __name__ == "__main__":
    main()

七、JavaScript算法源码

function dfs(arr, used, path, result) {
    if (path.length === arr.length) {
        result.push(path.join(''));
        return;
    }
    for (let i = 0; i < arr.length; i++) {
        if (used[i]) continue;
        if (i > 0 && arr[i] === arr[i - 1] && !used[i - 1]) continue;
        used[i] = true;
        path.push(arr[i]);
        dfs(arr, used, path, result);
        path.pop();
        used[i] = false;
    }
}

function main() {
    const fs = require('fs');
    const input = fs.readFileSync('/dev/stdin', 'utf8').trim().split('\n');
    const n = parseInt(input[0]);
    let arr = input[1].split(' ');
    arr.sort();
    let used = new Array(n).fill(false);
    let result = [];
    dfs(arr, used, [], result);
    for (let perm of result) {
        console.log(perm);
    }
}

main();

八、C算法源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 1000

char arr[MAX][2];
int used[MAX];
char path[MAX];
int n;
char result[MAX][MAX];
int count = 0;

// 比较函数,用于排序
int cmp(const void *a, const void *b) {
    return strcmp((char*)a, (char*)b);
}

void dfs(char arr[][2], int used[], char path[], int depth) {
    if (depth == n) {
        path[depth] = '\0';
        strcpy(result[count++], path);
        return;
    }
    for(int i = 0; i < n; i++) {
        if (used[i]) continue;
        if(i > 0 && strcmp(arr[i], arr[i-1]) == 0 && !used[i-1]) continue;
        used[i] = 1;
        path[depth] = arr[i][0];
        dfs(arr, used, path, depth + 1);
        used[i] = 0;
    }
}

int main(){
    // 读取输入
    scanf("%d", &n);
    for(int i = 0; i < n; i++) {
        scanf(" %s", arr[i]);
    }
    // 排序
    qsort(arr, n, sizeof(arr[0]), cmp);
    memset(used, 0, sizeof(used));
    dfs(arr, used, path, 0);
    // 输出结果
    for(int i = 0; i < count; i++) {
        printf("%s\n", result[i]);
    }
    return 0;
}

九、C++算法源码

#include <bits/stdc++.h>
using namespace std;

int main(){
    int n;
    cin >> n;
    vector<string> arr(n);
    for(auto &s : arr) cin >> s;
    sort(arr.begin(), arr.end());
    vector<bool> used(n, false);
    string path;
    vector<string> result;
    
    // 回溯函数
    function<void()> dfs = [&](void) {
        if(path.length() == n){
            result.push_back(path);
            return;
        }
        for(int i = 0; i < n; i++){
            if(used[i]) continue;
            if(i > 0 && arr[i] == arr[i-1] && !used[i-1]) continue;
            used[i] = true;
            path += arr[i];
            dfs();
            path.pop_back();
            used[i] = false;
        }
    };
    
    dfs();
    for(auto &s : result) cout << s << "\n";
    return 0;
}


🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。

在这里插入图片描述

;