1. 程式人生 > >排列組合 C語言實現

排列組合 C語言實現

#include <stdio.h>
#include <stdlib.h>

int array[] = {1,2,3,4};

#define N  4
#define M  3
int results[N] = {0}; //儲存已經找到的結果字首陣列
int results_end = 0; //結果字首陣列有效資料下標
int is_used[N] = {0}; //是否已經排列過了的標誌

/**
 * 排列
 * @param deep 遞迴深度
 * @param n 陣列最大長度
 */
void perm(int deep, int n)
{
    int i;
    if
(deep > n) // 越界遞迴結束 { return; } if (deep == n) // 找到結果,列印,遞迴結束 { for (i = 0; i < n; i++) { printf("%d", results[i]); } printf("\t"); return ; } for (i = 0; i < n; i++) { if (is_used[i] == 0) { is_used[i] = 1
; results[deep] = array[i]; perm(deep+1, n); is_used[i] = 0; } } } /** * 組合 * @param deep 遞迴深度 * @param n 陣列最大長度 * @param m 要查詢的組合的長度 */ void comb(int deep, int n, int m) { int i = 0; if (deep > n) // 越界遞迴結束 return ; if (results_end == m) // 找到結果,列印,遞迴結束
{ for (i = 0; i < m; i++) { printf("%d", results[i]); } printf("\t"); return ; } results[results_end++] = array[deep]; comb(deep+1, n, m); //向下一級遞迴 results_end--; comb(deep+1, n, m); //向下一級遞迴 } int main() { int i = 0; printf("全排列:\n"); perm(0, N); printf("\n1~%d的所有組合:\n", N); for(i=1; i<=N; i++){ comb(0, N, i); } printf("\n"); return 0; }

執行結果
[[email protected] data]# gcc test.c
[[email protected] data]# ./a.out
全排列:
1234 1243 1324 1342 1423 1432 2134 2143 2314 2341 2413 2431 3124 3142 3214 3241 3412 3421 4123 4132 4213 4231 4312 4321
1~4的所有組合:
1 2 3 4 12 13 14 23 24 34 123 124 134 234 1234

始於2010-12-30,Tencent;更新至2016-06-02,杭州。

相關推薦

排列組合 C語言實現

#include <stdio.h> #include <stdlib.h> int array[] = {1,2,3,4}; #define N 4 #define M

[遞迴] 排列組合 - 從一個字串中任意選取N個元素構成的所有排列組合 - C語言

排列組合 【題目】求從字串中"ABCD"中任取3個元素構成的所有排列組合 A

C語言實現排列組合

首先看遞迴實現,由於遞迴將問題逐級分解,因此相對比較容易理解,但是需要消耗大量的棧空間,如果執行緒棧空間不夠,那麼就執行不下去了,而且函式呼叫開銷也比較大。 (1) 全排列: 全排列表示把集合中元素的所有按照一定的順序排列起來,使用P(n, n) = n!表示n個元素全排列的個數。 例如:{1, 2

排列組合演算法的C#語言實現

using System; namespace Util.Comp { public class CombinationPermutation { public static void Main() { //全排列使用方法

c語言實現排列組合演算法問題

排列組合是演算法常用的基本工具,如何在c語言中實現排列組合呢?思路如下: 首先看遞迴實現,由於遞迴將問題逐級分解,因此相對比較容易理解,但是需要消耗大量的棧空間,如果執行緒棧空間不夠,那麼就執行不下去了,而且函式呼叫開銷也比較大。 (1) 全排列: 全排列表示把集合

C語言實現排列

one ide %d mut ota 技術 最大值 span space 一、遞歸實現全排列 1 #include"cstdio" 2 int A[50]; 3 void print_permutation(int n,int *A,int cur){ 4

m選n組合的兩種演算法(C語言實現

原問題:  Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. 1. 遞迴演算法 即首先選擇n,然後遞迴地從剩下的1...n-1選擇k-1

砝碼組合問題用c語言實現

5個砝碼用天平稱重時,我們希望用盡可能少的砝碼組合稱出儘可能多的重量。如果只有5個砝碼,重量分別是1,3,9,27,81。則它們可以組合稱出1到121之間任意整數重量(砝碼允許放在左右兩個盤中)。本題目要求程式設計實現:對使用者給定的重量,給出砝碼組合方案。例如:使用者輸入

二十四進制編碼串轉換為32位無符號整數(C語言實現

bool while open 參數錯誤 hint div 第一個字符 bsp opened typedef int BOOL; #define TRUE 1; #define FALSE 0; #define UINT_MAX 0xffffffff

遺傳算法的C語言實現(二)

print 比較 詳細 author 當前 cross max r+ 訪問 上一次我們使用遺傳算法求解了一個較為復雜的多元非線性函數的極值問題,也基本了解了遺傳算法的實現基本步驟。這一次,我再以經典的TSP問題為例,更加深入地說明遺傳算法中選擇、交叉、變異等核心步

C語言實現粒子群算法(PSO)二

計算 default img 第一個元素 1.4 best 實驗 atl 說過 上一回說了基本粒子群算法的實現,並且給出了C語言代碼。這一篇主要講解影響粒子群算法的一個重要參數---w。我們已經說過粒子群算法的核心的兩個公式為: Vid(k+1)=w*Vid(k)+c1*r

遺傳算法的C語言實現(一):以非線性函數求極值為例

選中 algorithm 利用 mail 進化 lock gcc 最大值 -s 以前搞數學建模的時候,研究過(其實也不算是研究,只是大概了解)一些人工智能算法,比如前面已經說過的粒子群算法(PSO),還有著名的遺傳算法(GA),模擬退火算法(SA),蟻群算法(A

C語言實現粒子群算法(PSO)一

mat 遺傳 基於 [1] 沒有 實驗 規模 直觀 解決 最近在溫習C語言,看的書是《C primer Plus》,忽然想起來以前在參加數學建模的時候,用過的一些智能算法,比如遺傳算法、粒子群算法、蟻群算法等等。當時是使用MATLAB來實現的,而且有些MATLAB自帶了工具

(續)順序表之單循環鏈表(C語言實現)

include 作者 指針 順序 gb2 mark oos case 循環 單循環鏈表和單鏈表的唯一差別在於單循環鏈表的最後一個節點的指針域指向第一個節點, 使得整個鏈表形成一個環. C實現代碼例如以下: #include<stdio.h>

geek青年的狀態機,查表,純C語言實現

fill south 總結 target 堅持 str 分享 接收 backward geek青年的狀態機,查表,純C語言實現 1. 問題的提出。抽象 建一,不止是他,不少人跟我討論過這種問題:怎樣才幹保證在需求變更、擴充的情況下。程序的主體部分不動呢? 這是一個

C語言實現數據結構串(堆分配存儲表示法)

+= 賦值 size ++ fine hello n) clu 刪除字符串 ———————————————————————————————————————————— 堆分配存儲表示法 —————————————————————————————————————————

帶頭節點的單鏈表-------C語言實現

lib gmail spa 階段 c語言實現 fun 變化 尾插 mail 1 /***************************************************** 2 Author:Simon_Kly Version:0.1

排序(3)---------冒泡排序(C語言實現)

std 強調 tracking i++ oid printf pre rand() 執行 說到冒泡排序,大一的時候第一次學習這個排序算法,可能大家不知道,“冒泡”在我說的方言裏面是吹牛逼的意思。所以就認為這個排序算法特吹牛逼有木有。 相信大家對全部的排

數據結構之---C語言實現廣義表頭尾鏈表存儲表示

tle substring [1] 原子 depth ring else if max sig //廣義表的頭尾鏈表存儲表示 //楊鑫 #include <stdio.h> #include <malloc.h> #include <std

C語言實現中綴表達式轉後綴表達式

ctype 結束 錯誤 ini c語言實現 base color src 格式 代碼如下: #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define STACK