枚举法--搭积木--蓝桥杯
有两种解法:一种不优化,就是一个全排列的问题,然后限制条件
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 int a[10]={0,1,2,3,4,5,6,7,8,9}; 5 int is() 6 { 7 if(a[0] < a[1] && a[0] < a[2] && a[1] < a[3] && a[1] < a[4] && a[2] < a[4] && a[2] < a[5] && a[3] < a[6] && a[3] < a[7] && a[4] < a[7] && a[4] < a[8] && a[5] < a[8] && a[5] < a[9]) 8 return 1; 9 else 10 return 0; 11 } 12 int main() 13 { 14 15 int sum=0; 16 for(int i=0;i<10*9*8*7*6*5*4*3*2;i++) 17 { 18 if(is()) 19 sum++; 20 next_permutation(a,a+10); 21 } 22 cout<<sum; 23 return 0; 24 }
解法二:优化算法
创新点:把这个转化成二维数组,这样的话在判断时候不用把这些都都写出来,只需要把b[i][j]和b[i+1][j] 还有b[i+1][j+1]进行比较就行 一旦发现比下面的大扥情况,就返回0,退出,否则返回1
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 int a[10]={0,1,2,3,4,5,6,7,8,9}; 5 int is() 6 { 7 int b[4][4]; 8 int k=0; 9 for(int i=0;i<4;i++) 10 { 11 for(int j=0;j<=i;j++) 12 { 13 b[i][j]=a[k++]; 14 } 15 } 16 for(int i=0;i<3;i++) 17 { 18 for(int j=0;j<=i;j++) 19 { 20 if(b[i][j]>=b[i+1][j]||b[i][j]>=b[i+1][j+1]) 21 { 22 return 0; 23 24 } 25 } 26 } 27 return 1; 28 } 29 int main() 30 { 31 32 int sum=0; 33 for(int i=0;i<10*9*8*7*6*5*4*3*2;i++) 34 { 35 if(is()) 36 sum++; 37 next_permutation(a,a+10); 38 } 39 cout<<sum; 40 return 0; 41 }