藍橋舊題_剪郵票問題

問題:剪郵票
有12張連在一起的12生肖的郵票,現在你要從中剪下5張來,要求必須是連着的。(僅僅連接一個角不算相連)
請你計算,一共有多少種不同的剪取方法。
請填寫表示方案數目的整數。
注意:你提交的應該是一個整數,不要填寫任何多餘的內容或說明性文字。
這裏把一些圖片省略了,題目原型可以直接搜索找到;
正確答案是:116
以下是一個錯誤的例子,因爲想法不周全導致剛開始解題的方向出錯,該部分內容只是做一個記錄方便日後查看;
剛開始解題直接想的用暴力算法可以解出,最後發現條件太多實在考慮不周全。(格子束縛是最大的一個無法精確判斷所有情況的原因)

#include <stdio.h>
#include <stdlib.h> 
int main(int argc, char *argv[]) {
	int i,j,k,l,m;
	int sum=0; 
	for(i=1;i<=12;i++){
		for(j=1;j<=12;j++){
			for(k=1;k<=12;k++){
				for(l=1;l<=12;l++){
					for(m=0;m<=12;m++){
						if((i<j)&&(j<k)&&(k<l)&&(l<m)){
							if   (((i==j-1)||(i==j-4)||(i==k-4)||(i==l-4)||(i==m-4))           //這裏存在一個問題就是數字存儲在三行四列的方格,						                                                                   
								&&((j==i+1)||(j==i+4)||(j==k-1)||(j==k-4)||(j==l-4)||(j==m-4))//但是我的結果存在五個數字連續的情況; 
								&&((k==i+4)||(k==j+1)||(k==j+4)||(k==l-1)||(k==l-4)||(k==m-4))
								&&((l==i+4)||(l==j+4)||(l==k+4)||(l==k+1)||(l==m-4)||(l==m-1))
								&&((m==i+4)||(m==j+4)||(m==k+4)||(m==l+1)||(m==l+4))  ){						
								printf("%d %d %d %d %d\n",i,j,k,l,m);
								sum++;
							}
						}
					}
				}
			}
		}
	}
	printf("%d",sum); 
	return 0;
}



292種結果是錯誤的;
最後分析了一下錯誤:這是三行四列的方格,如果不用數組,條件裏邊必須說明當兩個數相鄰時,大的數取餘0不能等於1,也就是大的數不能在下一行,這樣就確保換行,但是又有問題出現了,相鄰的數可以在下一行第一位,可以通過其餘的數對這兩個數進行相連,這樣問題就越想越複雜,有很多情況無法考慮周全,所以這個題直接用這樣的暴力算法求解是不明智的。

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