1. 程式人生 > >一道演算法題——8選6全排列

一道演算法題——8選6全排列

在網上看到一道題目:給定一個字串包含8組元素,任取其中六組進行全排列。

例如: string str = "01 02 03 04 05 06 07 08";   從中輸出所有由其中六個組成的序列。

思路:是用2進位制來表示這個字串的所有排列情況, 對每一位為1則輸出,如11111100則是010203040506;而最小的是00111111;

程式碼如下:

        //8選6的全排列
        public static void FullArrangement() {
            string str = "01 02 03 04 05 06 07 08";
            string[] nstr = str.Split(' ');

            int tar = 6;    //目標選擇6個
            int m = (0x01<<6)- 1;   // 00111111;
            int n = m << 2;         // 11111100;
            
            for (int i = m; i <= n; i++) {
                int k = i;      //儲存i;
                int temp = 1;   //用來比較k的每一位是否為1;
                int len = 0;  //記錄每一次迴圈的i中有多少個1;
                int index = 0;
                while (index < 8) {
                    if ((k & temp) == temp) {      //對k的每一位判斷是否為1
                        len++;
                    }
                    index++;
                    //Console.WriteLine(len);
                    temp <<= 1;                    //temp進位來匹配k的每一位
                    if (len > 6) break;
                }

                //如果相等則當前i 總共有6個1,則進行輸出
                if (len == tar) {
                    int current = 1;    //對i的每一位進行判斷是否為1
                    for (int j = 0; j < str.Length; j++) {
                        if ((i & current) == current) {
                            Console.Write(nstr[j] + " ");
                        }
                        current <<= 1;
                    }
                    Console.WriteLine();
                }
            }
        }