|
发表于 2016-3-2 11:23:48
|
显示全部楼层
- #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不显示
- ...
- 这种排列组合题目,注意改变的唯一性。字符串四个字符,保证其中三个不变,只变化一个就容易理解了。
- */
复制代码 |
评分
-
查看全部评分
|