KAY

          人之所以能,是相信能。
          posts - 6, comments - 5, trackbacks - 0, articles - 11
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          無向圖

          Posted on 2008-03-04 12:38 KAY 閱讀(284) 評論(1)  編輯  收藏

          java面試算法題(經典)
          算法程序題:

              該公司筆試題就1個,要求在10分鐘內作完。

              題目如下:用1、2、2、3、4、5這六個數字,用java寫一個main函數,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"與"5"不能相連。

            基本思路:
          1 把問題歸結為圖結構的遍歷問題。實際上6個數字就是六個結點,把六個結點連接成無向連通圖,對于每一個結點求這個圖形的遍歷路徑,所有結點的遍歷路徑就是最后對這6個數字的排列組合結果集。
          2 顯然這個結果集還未達到題目的要求。從以下幾個方面考慮:
            1. 3,5不能相連:實際要求這個連通圖的結點3,5之間不能連通, 可在構造圖結構時就滿足改條件,然后再遍歷圖。
            2. 不能有重復: 考慮到有兩個2,明顯會存在重復結果,可以把結果集放在TreeSet中過濾重復結果
            3. 4不能在第三位: 仍舊在結果集中去除滿足此條件的結果。

          采用二維數組定義圖結構,最后的代碼是:

          import java.util.Iterator;
          import java.util.TreeSet;

          public class TestQuestion {

          private String[] b = new String[]{"1", "2", "2", "3", "4", "5"};
          private int n = b.length;
          private boolean[] visited = new boolean[n];
          visited =falsh;
          private int[][] a = new int[n][n];
          private String result = "";
          private TreeSet TreeSet = new TreeSet();

          public static void main(String[] args) {
          new TestQuestion().start();
          }

          private void start() {
          for (int i = 0; i < n; i++) {
          for (int j = 0; j < n; j++) {
          if (i == j) {
          a[i][j] = 0;
          } else {
              a[i][j] = 1;
          }
          }
          }a[3][5] = 0;
          a[5][3] = 0;
          for (int i = 0; i < n; i++) {
              this.depthFirstSearch(i);
          }
          Iterator it = set.iterator();
          while (it.hasNext()) {
          String string = (String) it.next();

          if (string.indexOf("4") != 2) {
          System.out.println(string);
          }
          }
          }

          private void depthFirstSearch(int startIndex) {
          visited[startIndex] = true;
          result = result + b[startIndex];
          if (result.length() == n) {
          TreeSet .add(result);
          }
          for(int j = 0; j < n; j++) {
          if (a[startIndex][j] == 1 && visited[j] == false) {
          depthFirstSearch(j);
          } else {
          continue;
          }
          }
              result = result.substring(0, result.length() -1);
              visited[startIndex] = false;
          }
          }

           

          注:郁悶,花了半個多小時才能寫出來,還是看的提示!!!無向圖,學數據結構時對他就不是很感冒


          評論

          # re: 無向圖  回復  更多評論   

          2009-01-02 17:06 by 1212
          ....你這是用鄰接矩陣存儲的,當數據量大的時候將會變的很慢。。。

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          QQ:
          254653340
          MSN:
          xf_chouyang@hotmail.com
          主站蜘蛛池模板: 绥滨县| 娄烦县| 铁岭县| 平谷区| 武隆县| 珠海市| 蛟河市| 福鼎市| 西林县| 五峰| 凌海市| 蚌埠市| 通河县| 中江县| 西和县| 曲松县| 会理县| 泸溪县| 长沙县| 中牟县| 湘潭市| 唐海县| 凤庆县| 延寿县| 丹寨县| 成都市| 平定县| 洛隆县| 乌兰浩特市| 沧源| 周口市| 峨眉山市| 安平县| 广东省| 宁晋县| 喀喇沁旗| 武义县| 齐河县| 萨嘎县| 甘洛县| 文昌市|