输入父集,求出所有子集.

来源:互联网 发布:linux tomcat线程挂起 编辑:程序博客网 时间:2024/06/14 20:08
// 算法设计与分析第一次作业.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include <iostream>
using namespace std;


int n;//元素个数,由用户输入
int N[10];//元素内容,由用户输入
int static C[10];//用于存储子集,每次只存一个,输出一个子集后清空以便存下一个
int L;//总层次,即所求子集中元素的个数
void Out(int Initial,int Layer);//输出函数,其中Initial:由当前元素作为初始元素求父集的子集;  Layer:所求子集元素的个数;  
/*
例:
假设父集为(1,2,3,4,5),则Out(2,2)的结果为:23,24,25
假设父集为(1,2,3,4,5),则Out(2,3)的结果为:234,235,245
依次类推,则调用Out(0,1),Out(0,2)......的过程中不断调用Out(Initial+1,Layer-1)递归时程序运行结果为:
1
2
3
4
5
12
13
14
15
23
.
.
.
*/


int main()
{
/*初始化程序*/
for (int i = 0; i < 10; i++)
{
C[i] = 0;
}


/*输入元素个数*/
do
{
cout << "请输入元素个数(不超过10个):" << endl;
cin >> n;
if (n > 10)
{
cout << "出现错误:元素个数超出范围." << endl;
}
} while (n > 10);


/*输入元素内容*/
cout << "请输入所有元素(不相同):" << endl;
for (int i = 0; i < n; i++)
{
cin >> N[i];
}


/*输出结果*/
cout << "子集为:" << endl;
cout << "Φ" << endl;//输出空集
for (L = 1; L <= n; L++)//求元素个数分别从1到n的子集
{
Out(0, L);
}


    return 0;
}


void Out(int Initial,int Layer)
{
int initial=Initial;//输出时的初始值
int layer=Layer;//输出时的层次


if (layer > 0 && n-initial>=layer)//元素个数必须大于0
{
for (int i = initial; i < n; i++)
{
if (n - i >= layer)//父集中剩余元素个数必须大于所求子集中元素的个数
{
C[layer-1] = N[i];//以层次(元素个数)为联系反方向存结果,例如所求子集为123,则C[]中数据为321
Out(i + 1, layer - 1);//递归
}
}
}
else
{
int i = L-1;
do
{
cout << C[i];
i--;
} while ( i >= 0 );//反方向输出所求的一个子集
cout << endl;
return;
}
}
0 0
原创粉丝点击