#include <conio.h>
#include <iostream>
using namespace std;
char *collect = { "abcd" };
int init[100];//max = 100
int len = strlen( collect );
void doSet( int num )
{
if( num == 0 )
{
for (int n = 0; n < len; ++n) // ADD AT 2016-3-2 BY n0noper NOTE:添加这一句输出,结果就非常明显了
cout << init[n] << " ";
for( int i = 0; i< len; i++ )
{
if( init[i] == 0 )
cout<<collect[i];
}
cout<<endl;
return;
}
for( int i = 0; i<=1; i++ ) // 每一位分为0/1两个状态,0为显示,1为不显示
{
init[len-num] = i;
// printf("%d ",i); // LOGOUT AT 2016-3-2 BY n0noper
doSet( num -1 );
}
}
int main()
{
printf("%d\n",len);
doSet( len );
getch();
return 0;
}
/*
算法使用"排列组合"实现。 这么理解就容易了:四个学生A、B、C、D,他们都会抽烟,同一时刻,他们四人的抽烟状态(正在抽/没有抽)组合有多少种情况?
再如例子程序,例如:字符串abc,字串一共几种? (根据程序思想,建立用于显示的数组Show[len],len为字符串长度)
1. 当字符串第一位a显示时,第二位b则有两种可能:显示(值为0)、不显示(值为1);当第二位b为显示时,第三位c也有两种可能:显示或不显示。 // 每一位的后一位可能性判断和处理相同,所以写成了递归
Show[0]=0, Show[1]=0, Show[2]=0; // abc都显示
Show[0]=0, Show[1]=0, Show[2]=1; // c不显示
Show[0]=0, Show[1]=1, Show[2]=0; // b不显示
...
2. 当字符串第一位a不显示时,第二位b也是两种可能:显示与不显示;此时,第三位c重新计算,又有两种可能:显示或不显示。
Show[0]=1, Show[1]=0, Show[2]=0; // abc都显示
Show[0]=1, Show[1]=0, Show[2]=1; // c不显示
Show[0]=1, Show[1]=1, Show[2]=0; // b不显示
...
这种排列组合题目,注意改变的唯一性。字符串四个字符,保证其中三个不变,只变化一个就容易理解了。
*/
|