題目如下:
在圖中的九個點上,空出中間的點,其餘的點上任意填入數字1到8;1的位置固定不動,然後移動其餘的數字,使1到8順時針從小到大排列.移動的規律是:只能將數字沿線移向空白的點.請編程顯示數字移動過程。
最近一直在做題,因爲要參加一個考試了,所以每次做出來的題都寫寫博客,記錄一下,或者也可以幫助到學習的同學。我再次感到自己菜到不得了,沒看到高手的時候就以爲自己是高手,見到高手的時候發現自己什麼都不是,一直學習,不斷學習,哪個行業都一樣。所以學編程的同學們,加油了,一起學習。
我分析一下:
上面圖的8個圈可以用數組表示就可以,用鏈表什麼也可以,其實個人覺得數組就可以了,而且處理簡單。嗯,首先用一個數組作爲這8個圈,中間的圈用一個整形變量就可以。因爲1的位置固定不動,先把1的位置找出來,然後2到8循環處理。for2-8,例如找2的時候,先判斷2是否在1的後面,也就是數組的下一個數字是否是2,假如是2就continue處理下一個,假如不是,用中間變量保存數字2,然後之前的數字逐個向後移動,移動完將中間變量的2移動到對應的位置上。這裏有個問題就是數組邊界的問題,簡單處理一下就可以了,超過7就從0開始。
- public class Test100 {
- public static void main(String[] args) {
- /**
- * 假如arr爲圖中的環形的圈,數組是圈內數字
- * 變量em爲圖中間的圈
- */
- // int[] arr = {8, 2, 1, 5, 3, 6, 4, 7} ;
- int[] arr = {5, 2, 3, 1, 8, 6, 4, 7} ; // 當前填充的數組
- int em ; // em爲中間的圈等於要下一個要處理的數字
- int sum = 0 ; // 一共的移動次數
- int index1 = 0 ; // 數字1的數組下標
- for(int i = 0; i < 8; i++) { // 查找數字1的下標
- if(arr[i] == 1) {
- index1 = i ;
- }
- }
- // System.out.println("index1: " + index1) ;
- int t = 0 ; // 下一個要處理的數的下標
- int indexN = 0 ; // 下一個數的當前位置
- for(int n = 2; n <= 8; n++) { // 從2到8一個個找,
- t = index1+n-1 > 7 ? index1+n-1 - 8 : index1+n-1 ; // 找下一個的座標是哪裏
- if(arr[t] == n) // 假如下一個數是下一個座標的位置上,跳過不用處理
- continue ;
- for(int j = 0; j < 8; j++) {
- if(arr[j] == n) {
- indexN = j ;
- break ;
- }
- }
- em = arr[indexN] ; // em爲中間的圈等於要下一個要處理的數字
- System.out.println("數字" + arr[indexN] + "從" + indexN + "移動到" + "em") ;
- // System.out.println("下一個要處理的下標t :" + t + ", 下一個數的當前位置indexN :" + indexN + ", em :" + em) ;
- if(t > indexN) { // 下一個要處理的位置是否大於下一個數當前在的位置
- for(int k = indexN; k > 0; k--) {
- arr[k] = arr[k-1] ;
- sum++ ;
- System.out.println("數字" + arr[k-1] + "從" + (k-1) + "移動到" + k) ;
- }
- arr[0] = arr[7] ; // 過0處理,兩個for
- System.out.println("數字" + arr[7] + "從" + 7 + "移動到" + 0) ;
- sum++ ;
- for(int k = 7; k > t; k--) {
- arr[k] = arr[k-1] ;
- System.out.println("數字" + arr[k-1] + "從" + (k-1) + "移動到" + k) ;
- sum++ ;
- }
- }else if(t < indexN) {
- for(int k = indexN; k > t; k--) {
- arr[k] = arr[k-1] ;
- System.out.println("數字" + arr[k-1] + "從" + (k-1) + "移動到" + k) ;
- sum++ ;
- }
- }
- arr[t] = em ;
- System.out.println("數字" + em + "從" + "em" + "移動到" + t) ;
- sum++ ;
- for(int i : arr) {
- System.out.print(i + ", ") ;
- }
- System.out.println() ;
- }
- System.out.println("移動次數:" + sum) ;
- }
- }
其實我個人覺得這個題就是數組的越界回0處理,沒有什麼特別的。只是實現起來會有些糾結,其他別太多算法要想的
總體來講,還是比較簡單的。