2014-02-21 17 views
-2

進出口編碼一個小的益智遊戲爲我的課,我不知道如何做到這一點的一部分,它說如何產生一個隨機數排列

INT []指定者():在一個數組,其中返回該置換第一行的元素首先出現,然後是第二行的元素,等等。

shuffle():返回保證可解的置換。該方法很簡單。從身份置換開始,生成大量隨機生成的移動。想象一下,不是移動瓷磚,而是移動空的空間。在我的實施中,我正在應用1000次隨機移動。

怎麼辦指定者方法和洗牌方法

到目前爲止,我有這個

public class RandomPermutation { 

    private int row=3; 
    private column=3; 

    RandomPermutation(int row, int column){ 
    this.row=row; 
    this.colmn=column; 
    board 
    } 

    private int[] toArray(){ 
+0

哪種編程語言是您使用?將它添加到你問題的標籤列表中將會吸引更多可能的答案。 –

+0

@leeduhem我使用java – user3026272

+0

你的問題到底是什麼? – Bohemian

回答

0

我提供這個代碼片斷「是」,沒有任何形式的明示或暗示,包括包括但不限於適銷性和針對特定用途的適用性的默示保證,例如祕密獲得您作業中的完整分數的保證。

import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 

public class SlidingPuzzleRandomPermutation 
{ 
    public static void main(String[] args) 
    { 
     SlidingPuzzleRandomPermutation p = 
      new SlidingPuzzleRandomPermutation(4,3); 
     System.out.println(p); 
     p.shuffle(); 
     System.out.println(p); 
    } 

    private final Random random = new Random(0); 
    private final int row; 
    private final int column; 
    private final int array[]; 

    SlidingPuzzleRandomPermutation(int row, int column) 
    { 
     this.row = row; 
     this.column = column; 
     this.array = new int[row * column]; 
     for (int i=0; i<array.length; i++) 
     { 
      array[i] = (i+1)%array.length; 
     } 
    } 

    int[] toArray() 
    { 
     return array.clone(); 
    } 

    void shuffle() 
    { 
     final int UP = 0; 
     final int DOWN = 1; 
     final int LEFT = 2; 
     final int RIGHT = 3; 
     int zeroR = row-1; 
     int zeroC = column-1; 
     for (int i=0; i<1000; i++) 
     { 
      List<Integer> validDirections = new ArrayList<Integer>(); 
      if (zeroR > 0) validDirections.add(UP); 
      if (zeroR < row-1) validDirections.add(DOWN); 
      if (zeroC > 0) validDirections.add(LEFT); 
      if (zeroC < column-1) validDirections.add(RIGHT); 
      int directionIndex = random.nextInt(validDirections.size()); 
      int direction = validDirections.get(directionIndex); 
      int nextR = zeroR; 
      int nextC = zeroC; 
      switch (direction) 
      { 
       case UP : nextR--; break; 
       case DOWN : nextR++; break; 
       case LEFT : nextC--; break; 
       case RIGHT: nextC++; break; 
      } 
      swap(zeroR, zeroC, nextR, nextC); 

      zeroR = nextR; 
      zeroC = nextC; 
     } 

     while (zeroR < row-1) 
     { 
      swap(zeroR, zeroC, zeroR+1, zeroC); 
      zeroR++; 
     } 
     while (zeroC < column-1) 
     { 
      swap(zeroR, zeroC, zeroR, zeroC+1); 
      zeroC++; 
     } 
    } 

    private void swap(int r0, int c0, int r1, int c1) 
    { 
     int index0 = c0 + r0 * column; 
     int index1 = c1 + r1 * column; 
     int temp = array[index0]; 
     array[index0] = array[index1]; 
     array[index1] = temp; 

     //System.out.println("After swapping "+r0+" "+c0+" and "+r1+" "+c1); 
     //System.out.println(this); 
    } 

    @Override 
    public String toString() 
    { 
     StringBuilder sb = new StringBuilder(); 
     for (int r=0; r<row; r++) 
     { 
      for (int c=0; c<column; c++) 
      { 
       int index = c + r * column; 
       sb.append("["+array[index]+"]"); 
      } 
      sb.append("\n"); 
     } 
     return sb.toString(); 
    } 
} 

(我還在練習。當我長大了,我想成爲一名程序員)