數字移動

題目如下:

 

在圖中的九個點上,空出中間的點,其餘的點上任意填入數字1到8;1的位置固定不動,然後移動其餘的數字,使1到8順時針從小到大排列.移動的規律是:只能將數字沿線移向空白的點.請編程顯示數字移動過程。

最近一直在做題,因爲要參加一個考試了,所以每次做出來的題都寫寫博客,記錄一下,或者也可以幫助到學習的同學。我再次感到自己菜到不得了,沒看到高手的時候就以爲自己是高手,見到高手的時候發現自己什麼都不是,一直學習,不斷學習,哪個行業都一樣。所以學編程的同學們,加油了,一起學習。

 

我分析一下:

上面圖的8個圈可以用數組表示就可以,用鏈表什麼也可以,其實個人覺得數組就可以了,而且處理簡單。嗯,首先用一個數組作爲這8個圈,中間的圈用一個整形變量就可以。因爲1的位置固定不動,先把1的位置找出來,然後2到8循環處理。for2-8,例如找2的時候,先判斷2是否在1的後面,也就是數組的下一個數字是否是2,假如是2就continue處理下一個,假如不是,用中間變量保存數字2,然後之前的數字逐個向後移動,移動完將中間變量的2移動到對應的位置上。這裏有個問題就是數組邊界的問題,簡單處理一下就可以了,超過7就從0開始。

 

  1. public class Test100 { 
  2.  
  3.     public static void main(String[] args) { 
  4.         /** 
  5.          * 假如arr爲圖中的環形的圈,數組是圈內數字 
  6.          * 變量em爲圖中間的圈 
  7.          */ 
  8. //      int[] arr = {8, 2, 1, 5, 3, 6, 4, 7} ; 
  9.         int[] arr = {52318647} ; // 當前填充的數組 
  10.         int em ; // em爲中間的圈等於要下一個要處理的數字 
  11.         int sum = 0 ; // 一共的移動次數 
  12.          
  13.         int index1 = 0 ; // 數字1的數組下標 
  14.         for(int i = 0; i < 8; i++) { // 查找數字1的下標 
  15.             if(arr[i] == 1) { 
  16.                 index1 = i ; 
  17.             } 
  18.         } 
  19.          
  20. //      System.out.println("index1: " + index1) ; 
  21.          
  22.         int t = 0 ; // 下一個要處理的數的下標 
  23.         int indexN = 0 ; // 下一個數的當前位置 
  24.         for(int n = 2; n <= 8; n++) { // 從2到8一個個找, 
  25.             t = index1+n-1 > 7 ? index1+n-1 - 8 : index1+n-1 ; // 找下一個的座標是哪裏  
  26.             if(arr[t] == n) // 假如下一個數是下一個座標的位置上,跳過不用處理 
  27.                 continue ; 
  28.             for(int j = 0; j < 8; j++) { 
  29.                 if(arr[j] == n) { 
  30.                     indexN = j ; 
  31.                     break ; 
  32.                 } 
  33.             } 
  34.              
  35.             em = arr[indexN] ; // em爲中間的圈等於要下一個要處理的數字 
  36.             System.out.println("數字" + arr[indexN] + "從" + indexN + "移動到" + "em") ; 
  37. //          System.out.println("下一個要處理的下標t :" + t + ", 下一個數的當前位置indexN :" + indexN + ", em :" + em) ; 
  38.              
  39.             if(t > indexN) { // 下一個要處理的位置是否大於下一個數當前在的位置 
  40.                 for(int k = indexN; k > 0; k--) { 
  41.                     arr[k] = arr[k-1] ; 
  42.                     sum++ ; 
  43.                     System.out.println("數字" + arr[k-1] + "從" + (k-1) + "移動到" + k) ; 
  44.                 } 
  45.                 arr[0] = arr[7] ; // 過0處理,兩個for 
  46.                 System.out.println("數字" + arr[7] + "從" + 7 + "移動到" + 0) ; 
  47.                 sum++ ; 
  48.                 for(int k = 7; k > t; k--) { 
  49.                     arr[k] = arr[k-1] ; 
  50.                     System.out.println("數字" + arr[k-1] + "從" + (k-1) + "移動到" + k) ; 
  51.                     sum++ ; 
  52.                 } 
  53.             }else if(t < indexN) { 
  54.                 for(int k = indexN; k > t; k--) { 
  55.                     arr[k] = arr[k-1] ; 
  56.                     System.out.println("數字" + arr[k-1] + "從" + (k-1) + "移動到" + k) ; 
  57.                     sum++ ; 
  58.                 } 
  59.             } 
  60.             arr[t] = em ; 
  61.             System.out.println("數字" + em + "從" + "em" + "移動到" + t) ; 
  62.             sum++ ; 
  63.             for(int i : arr) { 
  64.                 System.out.print(i + ", ") ; 
  65.             } 
  66.             System.out.println() ; 
  67.         } 
  68.          
  69.         System.out.println("移動次數:" + sum) ; 
  70.  
  71.     } 
  72.  

其實我個人覺得這個題就是數組的越界回0處理,沒有什麼特別的。只是實現起來會有些糾結,其他別太多算法要想的

總體來講,還是比較簡單的。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章