演算法思想從根本上區別於網 上的諸多方法,思想基於把用來儲存一組數形成的所有序列的二維陣列看成乙個表(每個排列都是豎著放的,看著順眼)。而使用遞迴進行了類似於把表從上到下一行一行的填滿,有幾個數就有幾層遞迴(每層有多個遞迴)。這次關鍵乙個遞迴函式(只有30左右行),但從構思到寫**到除錯完成,花了將近一天半。還是紙上打稿,在寫**,最關鍵就在於畫圖了,根據圖來寫**。
舉例:當一組數為4個是(1,2,3,4)總排列數為(4*3*2*1)
分別以1,2,3,4開頭的序列各為6個(也就是以相同的乙個數開頭的有3*2*1個)
所以第一行分別連需填6個1,6個2,6個3,6個4;
而以1開頭的,它的下一行往後相當於(對除1以外的其他數(2,3,4)的所有排列(用遞迴了));
以2開頭。。。。。。。。。。。。。。。。。。。。。。。(1,3,4)。。。。。。。。。。。。;
以3開頭。。。。。。。。。。。。。。。。。。。。。。。(1,2,4)。。。。。。。。。。。。;
以4開頭。。。。。。。。。。。。。。。。。。。。。。。(1,3,2)。。。。。。。。。。。。;
就這樣從上往下一行一行地填表;
普遍性:當一組數為n個(a1,a2,a3...........an)總排列數為an*......*a3*a2*a1;
分別以a1,a2,a3,.....an開頭的序列各有(an-1*..........a3*a2*a1)(也就是總排列數除以數的總數)
此時的二維陣列為【n】【總排列數】;看成**進行填表;一層一層的填;
using system;
using system.collections.generic;
using system.linq;
using system.text;
for (int i = 0; i < item_num; i++)
// int item = new int[4] ;
// int[,] xulie = new int[4, 24];
qiongju(xulie, 0, 0, item);//進行重複的排列
/* int a = new int[5] ;
int b = new int[4];
newarray(a, b, 4);
for (int i = 0; i < 4; i++)
*/// bool insert==false;
int[,] n_xulie = new int[item_num, pailie_num];//將重複的排列刪了,剩下的都存入這個新陣列中;
int x_count=0;//上面新陣列存的數的個數
//////
///以下的迴圈執行刪除並存放的操作,畫個圖比較容易看懂
///for (int i = 0; i < pailie_num-1; i++)
}if (flag == item_num)
}if (insert == true)
x_count++;
}if (i ==pailie_num-2 )
x_count++;}}
for (int a = 0; a < x_count; a++)
// test(xulie, 4, 24);
//console.writeline("zhangbilei");
console.readline();
}///
/將array看成乙個橫向(列數為x),豎向(行數為y);利用遞迴進行類似於填表的操作
/對陣列array的每一行進行填數,陣列的每一列為乙個序列,行數為總序列數目
//y_start用來記錄要填充的當前行,///
static void qiongju(int[,] array, int y_start, int x_start, int item)
////以下作用:當前行中相同數進入下一層使用遞迴,y_index用於遞迴(區別於y_start,相當於進入遞迴後作為y_start)
/int new_num = item_num - 1;
if (new_num > 0)}}
}/// // ///
/// /// ///
/// /// ///將old陣列中下標不為deleted_index的數存入陣列new中;
/// /// // ///
///
static void newarray(int old, int new, int delete_index)}}
}}
求全排列演算法簡單的實現
求全排列演算法實現 一 遞迴實現 假如是乙個陣列,無重複元素的全排列,其簡單的遞迴實現演算法思想如下 假如 allsort a b c 分治思想化為a allsort b c b allsort a c c allsort a b 遞迴一層後計算第二層時 如allsort b c 時,化為b all...
遞迴演算法實現全排列
輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則輸出由字元a,b,c所能排列出來的所有字串 程式如下 include using namespace std void swap char a,char b void permutation char str,int k,int m ...
全排列演算法遞迴實現
前言 在一些演算法題當中有時需要進行全排列,是乙個比較簡單的遞迴呼叫,在這裡記錄下,以後可以直接拿來使用。過程 例如 第一步 和的全排列組合 和的全排列組合 和的全排列組合 第二步 針對這個集合在拆分為 和的全排列組合 和的全排列組合 之後就是模擬如此。集合中每個元素和剩下元素的全排列的組合。在對這...