1 vector<int> chosen; 2 int stack[100010],top=0,address=0,n,m; 3 4 void call(int x,int ret_addr) 5 { 6 int old_top=top; 7 stack[++top]=x; 8 stack[++top]=ret_addr; 9 stack[++top]=old_top; 10 } 11 12 int ret() 13 { 14 address=stack[top-1]; 15 top=stack[top]; 16 } 17 18 int main() 19 { 20 cin>>n>>m; 21 call(1,0); 22 while(top) 23 { 24 int x=stack[top-2]; 25 switch(address) 26 { 27 case 0: 28 if(chosen.size()>m||chosen.size()+(n-x+1)<m) 29 {ret();continue;} 30 if(x==n+1) 31 { 32 for(int i=0;i<chosen.size();++i) 33 printf("%d ",chosen[i]); 34 printf("\n"); 35 ret(); 36 continue; 37 } 38 call(x+1,1); 39 address=0; 40 continue; 41 case 1: 42 chosen.push_back(x); 43 call(x+1,2); 44 address=0; 45 continue; 46 case 2: 47 chosen.pop_back(); 48 ret(); 49 } 50 } 51 }
枚举第一行的点击方案,递推后面的