本题链接:
组合的输出
经典的深度搜索题。
深度搜索全排列模板:
//全排列问题
#include<bits/stdc++.h>
using namespace std;
int n;
char a[15];
char re[15];
int vis[15];
void dfs(int step)
{
int i;
if(step==n+1)//判断边界
{
for(i=1;i<=n;i++)
printf("%c",re[i]);
return ;
}
for(i=1;i<=n;i++)//遍历每一种情况
{
if(vis[i]==0)//check满足
{
re[step]=a[i];
vis[i]=1;//标记
dfs(step+1);//继续搜索
vis[i]=0;//恢复初始状态
}
}
return ;
}
int main(void)
{
dfs(1) ;
return 0;
}
本题代码思路和上述代码差不多,但要加入判断条件。
#include<bits/stdc++.h>
using namespace std;
int a[101], b[101], n,r;
void print()
{
int i;
for (i = 1; i <= r; i++)
{
cout <<setw(3)<< a[i];
}
cout << endl;
}
inline void dfs(int i)
{
int j;
if (i > r)
{
print();
return;
}
for (j = 1; j <= n; j++)
{
if (b[j] == 0&&j>a[i-1]||i==1)//加入判断条件
{
a[i] = j;
b[j] = 1;
dfs(i + 1);
b[j] = 0;
}
}
}
int main()
{
cin >> n>>r;
dfs(1);
return 0;
}
核心代码:
for (j = 1; j <= n; j++)
{
if (b[j] == 0&&j>a[i-1]||i==1)//加入判断条件
{
a[i] = j;
b[j] = 1;
dfs(i + 1);
b[j] = 0;
}
}
}