自己用暴力求解写的代码如下,但是数据一大时间复杂度太高。不理解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
*/