c 中的排列組合

2021-08-15 15:37:46 字數 1891 閱讀 3562

在做藍橋杯題目的時候,發現做題中很有用的東西,排列和組合。很多跟遍歷圖有關的演算法,都要用到排列和組合。比如第七屆藍橋杯的方格仔填數和剪郵票問題。

如下的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。這個是怎麼算出來的...