题意:从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案。
题解:可以直接进行dfs,但是今天要用非递归实现,那么就模拟堆栈进行实现,非常有意思的一个挑战。
附上代码:
#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
int n,m;
struct State{
int pos,u,sum,state;
};
void dfs(int u,int sum,int state)
{
if(sum+n-u<m||sum>m)return ;
if(sum==m){
for(int i=0;i<n;i++)if(state>>i&1)cout<<i+1<<" ";
cout<<endl;
return ;
}
dfs(u+1,sum+1,state|(1<<u));
dfs(u+1,sum,state);
}
int main()
{
cin>>n>>m;
// dfs(0,0,0);
stack<State>stk;
stk.push({0,0,0,0});
while(stk.size()){
auto t=stk.top();
stk.pop();
if(t.pos==0){
if(t.sum+n-t.u<m||t.sum>m)continue;
if(t.sum==m){
for(int i=0;i<n;i++)if(t.state>>i&1)cout<<i+1<<" ";
cout<<endl;
continue;
}
t.pos=1;
stk.push(t);
stk.push({0,t.u+1,t.sum+1,t.state|(1<<t.u)});
}else if(t.pos==1){
t.pos=2;
stk.push(t);
stk.push({0,t.u+1,t.sum,t.state});
}else continue;
}
return 0;
}