- 是否看了题解找思路
1.问题分析
简单的dfs,但是题解中用数组的0号位置存放数组的长度第一次见。
核心代码:
for (int i=x;i<=n;i++)
{
p[++p[0]]=i;
dfs(i+1);
p[p[0]--]=0;
}
其实稍加思索,本题就可以用二进制位运算来存储状态。
核心代码(不是自己写的):
void dfs(int x,int now,int date)
{
if (x>n || date+(n-x+1)<m)
return ;
if (date==m)
{
for (int i=1;i<=n;i++)
if (now>>(i-1) & 1)
cout<<i<<" ";
puts("");
return ;
}
dfs(x+1,now+(1<<x),date+1);
dfs(x+1,now,date);
}
2.具体代码
#include <iostream>
using namespace std;
int n,m,p[100];
void dfs(int x)
{
if(p[0]==m)//p[0]存的是长度
{
for(int j=1;j<=p[0];j++) cout<<p[j]<<" ";
cout<<endl;
}
else
{
for(int i=x;i<=n;i++)
{
p[++p[0]]=i;
dfs(i+1);
p[0]--;
}
}
}
int main()
{
cin>>n>>m;
dfs(1);
return 0;
}
3.总结
天天天天划水划水