1. 程式人生 > >NYOJ 32 組合數(dfs)

NYOJ 32 組合數(dfs)

組合數

時間限制:3000 ms  |  記憶體限制:65535 KB 難度:3
描述
找出從自然數1、2、... 、n(0<n<10)中任取r(0<r<=n)個數的所有組合。
輸入
輸入n、r。
輸出
按特定順序輸出所有組合。
特定順序:每一個組合中的值從大到小排列,組合之間按逆字典序排列。
樣例輸入
5 3
樣例輸出
543
542
541
532
531
521
432
431
421

321

#include<stdio.h>
#include<string.h>
int m,n;
int a[105],visit[105];
void dfs(int num){
	if(num==m){
		for(int i=0;i<num;i++)
		{
			printf("%d",a[i]);
		}printf("\n");
		return ;
	}
	for(int i=n;i>=1;i--){
		if(!visit[i]){//未標記 
			visit[i]=1;//標記為一 
			a[num]=i;//記錄i 
			if(num==0||a[num-1]>a[num]) dfs(num+1);//保證為降序,這一行也用來執行輸出,當找到第m個數時輸出 
			visit[i]=0;// 標記為0,否者只能輸出5的全排列 
		} 
		
	}
	
}
int main(){
	while(scanf("%d%d",&n,&m)!=EOF){
		memset(visit,0,sizeof(visit));
		dfs(0);
	}
}