算法題:問題:輸入一個數n(0



import java.util.Arrays;

/*	問題:輸入一個數n(0<x<10),輸入由1-n組成的所有可組成的數
 * 
 * 例:
 * 		輸入:3
 * 		輸出:
 * 1,2,3,
 * 12,13,21,23,31,32,
 * 123,132,213,231,312,321
 * 
 */

public class Test2 {
	
	public static void main(String[] args) {
		new Test2().show(3);
	}
	
	public void show(int n){
		for(int i=1;i<=n;i++){	//用於控制打印位數
			int[] arr = new int[i];	//創建存儲各個位數的數據的數組
			degui(n,arr,0,i);	//遞歸入口
		}
	}
	
	//	n代表組合數上限,arr是存儲每位數的數組, i是在本次遞歸中數放在數組中的位置下標,m是數的位數
	public void degui(int n,int[] arr,int i,int m){
		if(i==m){ //如果本次所放的位置達到本次的最大位數,則結束,並打印,遞歸出口
			int num=0;
			for(int j=0;j<arr.length;j++){
				num=num*10+arr[j];
			}
			System.out.println(num);
			return;
		}
		//在該位置上可以放置的數,輪着放
		for(int x=1;x<=n;x++){
			if(!have(arr,x,i)){	//判斷在該位置放的數在之前的位置中是否已經存在,不存在時纔可以放入
				arr[i]=x;
				degui(n,arr,i+1,m);	//該位置放好數,就放下一位置的數,i+1
			}
		}
	}
	
	
	
	//------------打印方式2,數組的方式-------------------------
	
	
	
	public void show2(int n){
		for(int i=1;i<=n;i++){
			int[] arr = new int[i];
			degui2(n,arr,0,i);
		}
	}
	
	public void degui2(int n,int[] arr,int i,int m){
		if(i==m){
			System.out.println(Arrays.toString(arr));
			return;
		}
		for(int x=1;x<=n;x++){
			if(!have(arr,x,i)){
				arr[i]=x;
				degui2(n,arr,i+1,m);
			}
		}
	}
	public boolean have(int[] arr,int x,int s){
		for(int i=0;i<s;i++){
			if(arr[i]==x){
				return true;
			}
		}
		return false;
	}
	
	
	//
	
}


方式一:打印效果




方式二:打印效果







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章