在做藍橋杯題目的時候,發現做題中很有用的東西,排列和組合。很多跟遍歷圖有關的演算法,都要用到排列和組合。比如第七屆藍橋杯的方格仔填數和剪郵票問題。
如下的10個格仔。填入0~9的數字。要求:連續的兩個數字不能相鄰。
(左右、上下、對角都算相鄰)
一共有多少種可能的填數方案?
請填寫表示方案數目的整數。
注意:你提交的應該是乙個整數,不要填寫任何多餘的內容或說明性文字。
這個題用到了全排列。正好c++stl中有全排列公式最後的**非常簡潔。
#include using namespace std;
int ans;
int a[10];
bool chk(int i,int j)//檢查元素是否相鄰
bool chk()//檢查特殊位置的元素
int main()
while(next_permutation(a,a+10))//全排列公式
printf("%d",ans);
return 0;
}
用到組合的問題
如【圖1.jpg】, 有12張連在一起的12生肖的郵票。
現在你要從中剪下5張來,要求必須是連著的。
(僅僅連線乙個角不算相連)
比如,【圖2.jpg】,【圖3.jpg】中,粉紅色所示部分就是合格的剪取。
請你計算,一共有多少種不同的剪取方法。
請填寫表示方案數目的整數。
注意:你提交的應該是乙個整數,不要填寫任何多餘的內容或說明性文字。
排列在c++stl中有了公式那麼組合是否有呢?很可惜的是沒有。不過你可以用遞迴的方法很簡單得表示組合。
比如求12中選5個,用高中的數學知識可以求得c(12)(5)等於792。然後用下面的遞迴程式演示一下結果也是792。
#includeint a[5], ans;
bool flag[3][4], vis[3][4];
void dfs(int k, int b)//從12中選5個的組合
for (int i = b; i <= 7 + k; i++) }
int main()
最後的結果正好也是792。
最後附上剪郵票問題的整個程式。
#includeusing namespace std;
int dx[4] = ;//東西方向
int dy[4] = ;//南北方向
int a[5], ans;//儲存郵票序號的陣列 已經選了的郵票數
bool flag[3][4], vis[3][4];//選出的5個郵票中是否存在這個郵票 這個郵票是否已經訪問過
void dfs2(int x, int y)//走下一步
}bool work()
dfs2(a[0] / 4, a[0] % 4);
for (int i = 0; i<5; i++)
return 1;
}void dfs(int k, int b)//生成5張郵票
for (int i = b; i <= 7 + k; i++) }
int main()
c 排列組合排序 排列組合 組合數專題
書接上回,本期正男老師將帶大家梳理排列組合中組合數的相關考點,組合數考點可以細分為4類,分別為 分類數數問題 分組排序問題 塗色問題以及插棍問題。近六年高考真題中,組合數考點共涉及5道。組合數專題高考真題分布 組合數的定義以及公式如下圖所示。組合數定義 分類數數問題與排列問題中的窮舉問題相似,但分類...
c 排列組合 UV機的顏色排列組合形式
隨著近幾年來uv應用的極速發展,也伴隨著大規模的生產使得uv機成本大幅度的下降,uv可謂是 舊時王謝堂前燕,飛入眾多廣告店。uv機以其應用廣泛,遍布無數行業,正是 uv應用範圍廣,尊稱萬能名號響。大到街邊廣告牌,小至手中鑰匙串。屋外門前地腳墊,家中電視背景牆。目之所及皆可見,細心觀察自然現。眾所周知...
C 實現排列組合
很多地方都遇過排列組合,比如計算問題的規模,資料的大小,占用磁碟空間多少等。1 全排列 全排列表示把集合中元素的所有按照一定的順序排列起來,使用p n,n n 表示n個元素全排列的個數。例如 的全排列為 123 132 213 231 312 321 共6個,即3!3 2 1 6。這個是怎麼算出來的...