一道不重復(fù)的隨機數(shù),每組9個數(shù)算法題

已知有36個數(shù)值對,如下圖所示:

01 02 03 04 05 06 07 08
     12 13 14 15 16 17 18
          23 24 25 26 27 28
               34 35 36 37 38
                    45 46 47 48
                         56 57 58
                              67 68
                                   78

現(xiàn)要求輸出4組 0-8 不重復(fù)的隨機數(shù),每組9個數(shù),順序不確定,

要求第1個數(shù)和第2個數(shù)(1-2),第2個數(shù)和第3個數(shù)(2-3),3-4,4-5,5-6,6-7, 1-5,2-9,4-8 兩兩組合,位置可以顛倒,組成的數(shù)值對在已知的36個數(shù)值對中存在。例如如下數(shù)組:

6 1 4 3 7 5 0 2 8
1-2 可以組成16 存在
2-3 可以組成14 存在
3-4 可以組成34 存在
4-5 可以組成37 存在
5-6 可以組成57 存在
6-7 可以組成05 存在
1-5 可以組成67 存在
2-9 可以組成18 存在
4-8 可以組成23 存在

那么這個隨機數(shù)組就成立,這個數(shù)組中組成的數(shù)值對(16 14 34 37 57 05 67 18 23)從36個數(shù)值對中移除掉,然后輸出第二組,第二組的數(shù)組也要滿足

兩兩組合后的數(shù)字存在于剩下的27個數(shù)值對中,都滿足后,然后把第二個數(shù)組可以組成的數(shù)值對從剩下的27個數(shù)組中移除掉,以此類推,輸出四組數(shù)如

0, 1, 2, 3, 4, 5, 6, 7, 8,
1, 6, 4, 2, 5, 7, 0, 8, 3,
2, 7, 4, 8, 0, 5, 3, 6, 1,
0, 6, 7, 8, 3, 1, 4, 5, 2  
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class com
{
   private static long factorial(int n)
   {
      return (n > 1) ? n * factorial(n - 1) : 1;
   }

   /**
    * 計算排列數(shù),即A(n, m) = n!/(n-m)!
    * 
    * @param n
    * @param m
    * @return
    */
   public static long arrangement(int n, int m)
   {
      return (n >= m) ? factorial(n) / factorial(n - m) : 0;
   }

   /**
    * 排列選擇(從列表中選擇n個排列)
    * 
    * @param dataList
    *           待選列表
    * @param n
    *           選擇個數(shù)
    */
   public static List<String> arrangementSelect(String[] dataList, int n)
   {
      System.out.println(String.format("A(%d, %d) = %d", dataList.length, n,
            arrangement(dataList.length, n)));
      String[] res = new String[n];
      List<String> total = new ArrayList<>();
      arrangementSelect(dataList, res, 0, total);
      return total;
   }

   /**
    * 排列選擇
    * 
    * @param dataList
    *           待選列表
    * @param resultList
    *           前面(resultIndex-1)個的排列結(jié)果
    * @param resultIndex
    *           選擇索引,從0開始
    */
   private static void arrangementSelect(String[] dataList, String[] resultList,
         int resultIndex, List<String> total)
   {
      int resultLen = resultList.length;
      if (resultIndex >= resultLen)
      { // 全部選擇完時,輸出排列結(jié)果

         String re = "";
         for (String s : resultList)
         {
            re += s;
         }
         total.add(re);
         return;
      }

      // 遞歸選擇下一個
      for (int i = 0; i < dataList.length; i++)
      {
         // 判斷待選項是否存在于排列結(jié)果中
         boolean exists = false;
         for (int j = 0; j < resultIndex; j++)
         {
            if (dataList[i].equals(resultList[j]))
            {
               exists = true;
               break;
            }
         }
         if (!exists)
         { // 排列結(jié)果不存在該項,才可選擇
            resultList[resultIndex] = dataList[i];
            arrangementSelect(dataList, resultList, resultIndex + 1, total);
         }
      }
   }

   // 36個數(shù)值對
   public static List<String> getList()
   {
      List<String> list = new ArrayList<>();
      list.add("01");
      list.add("02");
      list.add("03");
      list.add("04");
      list.add("05");
      list.add("06");
      list.add("07");
      list.add("08");
      list.add("12");
      list.add("13");
      list.add("14");
      list.add("15");
      list.add("16");
      list.add("17");
      list.add("18");
      list.add("23");
      list.add("24");
      list.add("25");
      list.add("26");
      list.add("27");
      list.add("28");
      list.add("34");
      list.add("35");
      list.add("36");
      list.add("37");
      list.add("38");
      list.add("45");
      list.add("46");
      list.add("47");
      list.add("48");
      list.add("56");
      list.add("57");
      list.add("58");
      list.add("67");
      list.add("68");
      list.add("78");
      return list;

   }

   public static List<String> getData()
   {
      List<String> list = new ArrayList<>();
      list.add("0");
      list.add("1");
      list.add("2");
      list.add("3");
      list.add("4");
      list.add("5");
      list.add("6");
      list.add("7");
      list.add("8");

      return list;

   }

   private static List<String> deleteIn(List<String> data, String deletString)
   {

      List<String> sor = new ArrayList<>();
      for (String str : data)
      {
         if (!deletString.equals(str))
         {
            sor.add(str);
         }
      }
      return sor;
   }

   private static void filerData(List<String> isLockdata, List<String> data,
         List<String> randDatas, int endsign, List<String> ends, int loopsige)
   {
      if (endsign == 6)
      {

         if (isLockdata.contains((randDatas.get(0) + randDatas.get(4)))|| isLockdata.contains((randDatas.get(4) + randDatas.get(0))))
         {

            isLockdata = deleteIn(isLockdata,(randDatas.get(0) + randDatas.get(4)));
            isLockdata = deleteIn(isLockdata,(randDatas.get(4) + randDatas.get(0)));
            for (String str : data)
            {

               if (isLockdata.contains(randDatas.get(3) + str)|| isLockdata.contains(str + randDatas.get(3)))
               {
                  isLockdata = deleteIn(isLockdata, (randDatas.get(3) + str));
                  isLockdata = deleteIn(isLockdata, (str + randDatas.get(3)));

                  data = deleteIn(data, str);

                  randDatas.add(str);

                  if (data.size() == 0)
                  {
                     break;
                  }

                  if (isLockdata.contains(randDatas.get(1) + data.get(0))|| isLockdata.contains(data.get(0) + randDatas.get(1)))
                  {
                     
                     randDatas.add(data.get(0));
                     // System.out.println(randDatas);
                     ends.addAll(randDatas);

                     if (loopsige == 4)
                     {
                        System.out.println(ends);// ok好了
                        return;
                     }

                     isLockdata = deleteIn(isLockdata,
                           (randDatas.get(1) + data.get(0)));
                     isLockdata = deleteIn(isLockdata,
                           (data.get(0) + randDatas.get(1)));

                     List<String> newends = new ArrayList<>();
                     for (String d : ends)
                     {

                        newends.add(d);
                     }
                     List<String> newisLockdata = new ArrayList<>();
                     List<String> newisLockdata2 = new ArrayList<>();
                     for (String d : isLockdata)
                     {
                        newisLockdata.add(d);
                        newisLockdata2.add(d);
                     }
                     int newloopsign = loopsige + 1;
                     getNmber(newisLockdata, newisLockdata2, ends, newloopsign);

                     return;

                  }
               }

            }

         }

      }

      if (randDatas == null || randDatas.size() == 0)
      {
         return;
      }

      String endchar = randDatas.get(randDatas.size() - 1);

      List<String> old = new ArrayList<>();
      for (String d : data)
      {

         old.add(d);
      }
      for (String d : old)
      {
         String next = endchar + d;
         String renext = d + endchar;
         if (isLockdata.contains(next) || isLockdata.contains(renext))
         {

            List tempdata = deleteIn(data, d);
            List olddata = new ArrayList<>();
            for (String lockdata : isLockdata)
            {
               olddata.add(lockdata);

            }
            olddata = deleteIn(olddata, next);
            olddata = deleteIn(olddata, renext);

            List<String> newrandDatas = new ArrayList<>();
            for (String rand : randDatas)
            {

               newrandDatas.add(rand);
            }
            newrandDatas.add(d);
            int newendsign = endsign + 1;

            List<String> endsDatas = new ArrayList<>();
            for (String rand : ends)
            {
               endsDatas.add(rand);
            }

            filerData(olddata, tempdata, newrandDatas, newendsign, endsDatas,
                  loopsige);

         }

      }

   }

   private static void getNmber(List<String> res, List<String> isLockdata,
         List<String> ends, int loopsign)
   {

      for (String tString : res)
      {
         List<String> data = getData();

         List<String> randDatas = new ArrayList<>();
         char[] cs = tString.toCharArray();

         for (char s : cs)
         {
            data = deleteIn(data, String.valueOf(s));
            randDatas.add(String.valueOf(s));
         }
         List<String> newisLockdata = new ArrayList<>();
         for (String str : isLockdata)
         {

            newisLockdata.add(str);
         }

         newisLockdata = deleteIn(newisLockdata, tString);
         newisLockdata = deleteIn(newisLockdata,
               String.valueOf(cs[1]) + String.valueOf(cs[0]));

         filerData(newisLockdata, data, randDatas, 1, ends, loopsign);

      }

   }

   public static void main(String[] args)
   {

      List<String> res = arrangementSelect(new String[]
      { "0", "1", "2", "3", "4", "5", "6", "7", "8" }, 2);
      List<String> ends = new ArrayList<>();
      getNmber(res, getList(), ends, 1);

   }
}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容