藍橋 剪郵票

如【圖1.jpg】, 有12張連在一起的12生肖的郵票。
現在你要從中剪下5張來,要求必須是連着的。
(僅僅連接一個角不算相連)
比如,【圖2.jpg】,【圖3.jpg】中,粉紅色所示部分就是合格的剪取。


請你計算,一共有多少種不同的剪取方法。


請填寫表示方案數目的整數。
注意:你提交的應該是一個整數,不要填寫任何多餘的內容或說明性文字。

116


#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int mp[12]= {1,2,3,4,6,7,8,9,11,12,13,14};  
int aa[5];
bool vis[5];
int sum=0;  
int bu[4]= {-1,1,-5,+5};  
bool f;
void dfs(int x) {  
    for (int i=0;i<4;i++) {  
        int xx=aa[x]+bu[i];  
        if(xx<1 || xx>14 || xx==5 || xx==10) continue;  
        for (int j=0;j<5;j++) {
        	if (!vis[j] && aa[j]==xx) {  
                vis[j]=true;  
                dfs(j);  
            } 
		}  
    }  
    return;
}  
int main()  
{  
    for (int a=0;a<12;a++) {
    	for (int b=a+1;b<12;b++) {
    		for (int c=b+1;c<12;c++) {
    			for (int d=c+1;d<12;d++) {
    				for (int e=d+1;e<12;e++) {
    					aa[0]=mp[a];  
                        aa[1]=mp[b];  
                        aa[2]=mp[c];  
                        aa[3]=mp[d];  
                        aa[4]=mp[e];
                        memset(vis,false,sizeof(vis));
                        vis[0]=true;
                        dfs(0);
                        f=true;  
                        for (int i=0;i<5;i++) {  
                            if (!vis[i]) {  
                                f=false;  
                                break;  
                            }  
                        }  
                        if (!f) continue;  
                        else  
                            sum++;
					}
				}
			}
		}
	} 
    printf ("%d\n",sum);  
    return 0;  
}  


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