Ich möchte meine Arraylist senden:Arraylist Array senden zu überprüfen, ob Puzzle auflösbar ist
ArrayList<Tile> myList = new ArrayList<Tile>();
, dass nach:
public void shuffleBoard() {
Collections.shuffle(myList);
for (int i = 0; i < SIZE; i++) {
}
switch (SIZE) {
case 0:
moveEmptyTile(Direction.UP);
case 1:
moveEmptyTile(Direction.DOWN);
case 2:
moveEmptyTile(Direction.LEFT);
case 3:
moveEmptyTile(Direction.RIGHT);
}
sieht wie folgt aus:
[[ 05 ], [ 12 ], [ ** ], [ 08 ], [ 02 ], [ 03 ], [ 01 ], [ 10 ], [ 04 ], [ 11 ], [ 07 ], [ 15 ], [ 13 ], [ 09 ], [ 06 ], [ 14 ]]
Das I möchte an ein Array senden, damit ich prüfen kann, ob die Karte mit diesem Code lösbar ist:
public static boolean isSolvable(int[] state){
//prepare the mapping from each tile to its position
int[] positions = new int[16];
for(int i = 0; i < state.length; i++){
positions[state[i]] = (i+1)%16;
}
//check whether this is an even or odd state
int row = (positions[0]-1)/4;
int col = (positions[0]-1)-row*4;
boolean isEvenState = positions[0] == 0 || row % 2 == col %2;
//count the even cycles
int evenCount = 0;
boolean[] visited = new boolean[16];
for(int i = 0; i < positions.length; i++){
if(visited[i])
continue;
//a new cycle starts at i. Count its length..
int cycleLength = 0;
int nextTile = i;
while(!visited[nextTile]){
cycleLength++;
visited[nextTile] = true;
nextTile = positions[nextTile];
}
if(cycleLength % 2 == 0)
evenCount++;
}
return isEvenState == (evenCount % 2 == 0);
Deshalb möchte ich meine Arraylist
zu einem Array
konvertieren, und zurück, dass als int[] state
-isSolvable(int[] state)
so kann man erkennen, ob mein Puzzle auflösbar ist.
Es ist wahrscheinlich etwas dumm einfach, aber mein Kopf ist Gelee nach dem Versuch dieses Forum für eine Lösung zu suchen.
My Tile-Klasse:
public class Tile {
private int value;
private static int maxValue = 15;
private static int minValue = 0;
public Tile(int value) {
setValue(value);
}
public int getValue() {
return value;
}
public void setValue(int value) {
if (value <= maxValue)
this.value = value;
else if (value > maxValue)
System.err.print("To high");
}
public boolean isEmpty() {
if (getValue() == minValue) {
return true;
} else {
return false;
}
}
@Override
public String toString() {
if (this.isEmpty() == true) {
return "[ ** ]";
}
if (this.value < 10) {
return "[ 0" + value + " ]";
}
else {
return "[ " + value + " ]";
}
}
}
Mit freundlichen Grüßen.
Wie kann ein 'Tile' (was immer das ist) in ein' int' umgewandelt werden? – Seelenvirtuose
Das 'Tile' ist ein' int', das an einen 'toString' gesendet wurde. Wenn ich wie oben beschrieben nicht kann, dann muss ich einfach etwas von meinem Code wiederholen und ein 'Array' anstelle eines' Arraylist' verwenden, so viel wie ich es bekomme. –
Nein. Ein 'Tile' ist ein' Tile' und ein 'int' ist ein' int'. Ein 'Tile' ist möglicherweise eine Klasse, die Sie selbst deklariert haben. Diese Erklärung ist ein wichtiger Teil deiner Frage, also zeige diesen Code auch! – Seelenvirtuose