递归求解版本
查看原帖
递归求解版本
552736
zp2070000楼主2024/1/12 17:11

本题 递归求解,利用bool 数组标记哪一个数值被用到, 为了防止递归回溯时,发生 小编号重复被使用,造成多个组合不同顺序, 数字一样的这种情况,在递归时,再传递 当前下标 pos的参数。 每次使用当前pos 之后,会避免这种问题。 AC代码(有注释)

#include<iostream>
#include<cstdio>
using namespace std;
bool flag[30];// 标记数组
int n,r;

void dfs(int pos,int k) // 当前位置  和 累计找到的个数
{
	if(k==r) // 判定结束
	{
		for(int i=1;i<=n;i++) // 遍历
		{
			 if(flag[i])  printf("%3d",i);
		}
		printf("\n");
	}
	for(int i=pos;i<=n;i++) // i 初始为pos ,保证字典顺序
	{
		 if(flag[i]==0)
		 {
		 	 flag[i]=1;  //标记
		 	 dfs(i+1,k+1);  //下一层
		 	 flag[i]=0;  // 回溯
		 }
	}
	return;
}

int main()
{
   scanf("%d%d",&n,&r);
   
   dfs(1,0);   

return 0;
}

2024/1/12 17:11
加载中...