求解如何用X算法解决精准覆盖问题?

自己用暴力求解写的代码如下,但是数据一大时间复杂度太高。不理解Algorithm X算法的回溯过程,如何用C++完成Algorithm X算法呢?

#include<iostream>
#include<string.h>
using namespace std;

//方法1:穷举法,只适用于元素数量少和集合数量少的情况
int ac_ex(int enda[], int endan, int a[], int an, int b[], int bn,  int c[], int cn, int d[], int dn)
{
    //构建二维数组
    int flag[4] = {0, 0, 0, 0};
    int ta[4][endan];
    memset(ta,0,sizeof(ta));
    for(int i = 0; i < an; i++){
            ta[0][a[i] - 1] = 1;
    }
    for(int i = 0; i < bn; i++){
            ta[1][b[i] - 1] = 1;
    }
    for(int i = 0; i < cn; i++){
            ta[2][c[i] - 1] = 1;
    }
    for(int i = 0; i < dn; i++){
            ta[3][d[i] - 1] = 1;
    }
    cout << "构建完成的矩阵为:" << endl;
    for(int i = 0; i < 4; i++){
        for(int j = 0; j < endan; j++){
            cout << ta[i][j] << "  ";
        }
        cout << endl;
    }
    for(int i = 0; i < 7; i++){
        for(int j = 1; j < 4; j++){
            if(flag[j] == 1){
                continue;
            }
            if(ta[0][i] == ta[j][i]){
                flag[j] = 1;
            }
            if(flag[0] == 1 && flag[1] == 1 && flag[2] == 1 && flag[3] == 1){
                i = 7;
                j = 4; // 跳出双重循环
            }
        }
    }
    if(flag[1] == 0){
        cout << "有限集的精准覆盖为:A、B" << endl;
        return 0;
    }
    if(flag[2] == 0){
        cout << "有限集的精准覆盖为:A、C" << endl;
        return 0;
    }
    if(flag[3] == 0){
        cout << "有限集的精准覆盖为:A、D" << endl;
        return 0;
    }
    memset(flag,0,sizeof(flag));
    for(int i = 0; i < 7; i++){
        for(int j = 0; j < 4; j++){
                if(j == 1){
                    j++;
                }
            if(flag[j] == 1){
                continue;
            }
            if(ta[1][i] == ta[j][i]){
                flag[j] = 1;
            }
            if(flag[0] == 1 && flag[1] == 1 && flag[2] == 1 && flag[3] == 1){
                i = 7;
                j = 4; // 跳出双重循环
            }
        }
    }
    if(flag[0] == 0){
        cout << "有限集的精准覆盖为:A、B" << endl;
        return 0;
    }
    if(flag[2] == 0){
        cout << "有限集的精准覆盖为:B、C" << endl;
        return 0;
    }
    if(flag[3] == 0){
        cout << "有限集的精准覆盖为:B、D" << endl;
        return 0;
    }
    memset(flag,0,sizeof(flag));
     for(int i = 0; i < 7; i++){
        for(int j = 0; j < 4; j++){
                if(j == 2){
                    j++;
                }
            if(flag[j] == 1){
                continue;
            }
            if(ta[2][i] == ta[j][i]){
                flag[j] = 1;
            }
            if(flag[0] == 1 && flag[1] == 1 && flag[2] == 1 && flag[3] == 1){
                i = 7;
                j = 4; // 跳出双重循环
            }
        }
    }
    if(flag[0] == 0){
        cout << "有限集的精准覆盖为:A、C" << endl;
        return 0;
    }
    if(flag[2] == 0){
        cout << "有限集的精准覆盖为:B、C" << endl;
        return 0;
    }
    if(flag[3] == 0){
        cout << "有限集的精准覆盖为:C、D" << endl;
        return 0;
    }
    memset(flag,0,sizeof(flag));
     for(int i = 0; i < 7; i++){
        for(int j = 0; j < 3; j++){
            if(flag[j] == 1){
                continue;
            }
            if(ta[3][i] == ta[j][i]){
                flag[j] = 1;
            }
            if(flag[0] == 1 && flag[1] == 1 && flag[2] == 1 && flag[3] == 1){
                i = 7;
                j = 4; // 跳出双重循环
            }
        }
    }
    if(flag[0] == 0){
        cout << "有限集的精准覆盖为:A、D" << endl;
        return 0;
    }
    if(flag[2] == 0){
        cout << "有限集的精准覆盖为:B、D" << endl;
        return 0;
    }
    if(flag[3] == 0){
        cout << "有限集的精准覆盖为:C、D" << endl;
        return 0;
    }
}

int main()
{
    int endan, an, bn, cn, dn;
    cout << "请输入目标集合中元素的个数:";
    cin >> endan;
    int enda[endan];
    cout << "请输入目标集合中的元素:";
    for(int i = 0; i < endan; i++){
        cin >> enda[i];
    }
    cout << "请输入a集合中元素的个数:";
    cin >> an;
    int a[an];
    cout << "请输入a集合中的元素:";
    for(int i = 0; i < an; i++){
        cin >> a[i];
    }
    cout << "请输入b集合中元素的个数:";
    cin >> bn;
    int b[bn];
    cout  << "请输入b集合中的元素:";
    for(int i = 0; i < bn; i++){
        cin >> b[i];
    }
    cout << "请输入c集合中元素的个数:";
    cin >> cn;
    int c[cn];
    cout  << "请输入c集合中的元素:";
    for(int i = 0; i < cn; i++){
        cin >> c[i];
    }
    cout << "请输入d集合中元素的个数:";
    cin >> dn;
    int d[dn];
    cout  << "请输入d集合中的元素:";
    for(int i = 0; i < dn; i++){
        cin >> d[i];
    }
    ac_ex(enda, endan,  a, an, b, bn, c, cn, d, dn);
}
/*
7 1 2 3 4 5 6 7
2 1 4
3 1 2 5
4 3 4 6 7
3 2 3 7
*/