問題:剪郵票
有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,也就是大的數不能在下一行,這樣就確保換行,但是又有問題出現了,相鄰的數可以在下一行第一位,可以通過其餘的數對這兩個數進行相連,這樣問題就越想越複雜,有很多情況無法考慮周全,所以這個題直接用這樣的暴力算法求解是不明智的。