1. 程式人生 > >演算法與設計——列舉——ch_01

演算法與設計——列舉——ch_01

題  目:

04五個數字,組成5位數,每個數字用一次,但十位和百位不能為3(當然萬位不能為0),輸出所有可能的五位數。

題目分析:

顯然這是一個列舉演算法中區間列舉的經典案例,從“04五個數字,組成5位數”可以看出用五重迴圈實現,限制條件是“每個數字用一次,但十位和百位不能為3(當然萬位不能為0”。第一重迴圈確定萬位,第二重迴圈確定千位。。。以此類推到第五重迴圈確定個位。

列舉演算法(區間列舉)的框架:

n=0;
for(k=<區間下限>;k<=<區間上限>;k++)    //根據實際情況控制列舉範圍
{<運算操作序列>
    if(<約束條件>)    //根據約束條件實施篩選
    {
        System.out.print(<滿足要求的解>);    //逐一輸出問題的解
        n++;    //統計解的個數
    }
}
System.out.print(<解的個數>);    //輸出解的個數
程式碼:

public class ch_01 {
    public static void main(String [] args)
    {
    	for(int i=1;i<=4;i++)//第一重迴圈確定萬位
    		for(int j=0;j<=4;j++)//確定千位
    		{
    			if(j==i)//和萬位重複跳出本次迴圈
    				continue;
      			for(int k=0;k<=4;k++)//確定百位
    			{
    				if(k==3||k==i||k==j)//百位不為3,和萬位或者千位重複跳出迴圈
    					continue;
    				for(int l=0;l<=4;l++)//確定十位
    				{
    					if(l==3||l==i||l==j||l==k)//十位不為3,和萬位或者千位或百位重複跳出迴圈
    						continue;
    					for(int m=0;m<=4;m++)//確定個位
    					{
        					if(m==i||m==j||m==k||m==l)//和萬位或者千位或百位或者十位重複跳出迴圈
        						continue;
        					System.out.println(i+""+j+""+k+""+l+""+m);//輸出每一組成立的數
    					}
    				}	
    			}
    		}
    }
}

執行結果:

10243 10423 12043 12403 13024 13042 13204 13240 13402 13420 14023 14203
20143 20413 21043 21403 23014 23041 23104 23140 23401 23410 24013 24103
30124 30142 30214 30241 30412 30421 31024 31042 31204 31240 31402 31420

32014 32041 32104 32140 32401 32410 34012 34021 34102 34120 34201 34210
40123 40213 41023 41203 42013 42103 43012 43021 43102 43120 43201 43210