我提供這個代碼片斷「是」,沒有任何形式的明示或暗示,包括包括但不限於適銷性和針對特定用途的適用性的默示保證,例如祕密獲得您作業中的完整分數的保證。
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();
}
}
(我還在練習。當我長大了,我想成爲一名程序員)
哪種編程語言是您使用?將它添加到你問題的標籤列表中將會吸引更多可能的答案。 –
@leeduhem我使用java – user3026272
你的問題到底是什麼? – Bohemian