شما برای اینکه مراحل تکراری رو انجام ندید باید ببینید قبلا چنین حالتی ایجاد شده یا نه. برای این منظور یکی از بهترین ساختارها درخت جستجو دودویی هست که مراحل تکراری رو سریع پیدا کنید و انجام ندید.
پیاده سازی BST:
http://algorithms.tutorialhorizon.co...mplementation/
و به یک درخت برای ایجاد حالات مختلف نیاز دارید، در حقیقت چیزی که در پست اول پرسیدید.
تابع getEuclides هم فاصله حالت فعلی از حالت مطلوب رو محاسبه میکنه و ارتباطی با ساخت درخت نداره.
public class Tree {
TNode root;
public Tree(String str) {
root = new TNode(str, null);
}
void addLeft(TNode pn, TNode tn) {
pn.left = tn;
}
void addRight(TNode pn, TNode tn) {
pn.right = tn;
}
void addUp(TNode pn, TNode tn) {
pn.up = tn;
}
void addDown(TNode pn, TNode tn) {
pn.down = tn;
}
private class TNode {
TNode parentNode;
TNode left;
TNode right;
TNode up;
TNode down;
String value;
int euclids;
TNode(String val, TNode p) {
left = null;
right = null;
up = null;
down = null;
value = val;
euclids = getEuclids();
parentNode = p;
}
void setLeft(TNode le) {
left = le;
}
void setRight(TNode ri) {
right = ri;
}
void setUp(TNode u) {
up = u;
}
void setDown(TNode dow) {
down = dow;
}
boolean isFinal() {
return euclids == 0;
}
int getEuclids() {
int sum = 0, v = 0, h = 0;
for (int i = 0; i < 9; i++) {
switch (value.charAt(i) - '0') {
case 1:
v = i / 3;
h = i % 3;
break;
case 2:
v = i / 3;
h = i % 3 - 1;
break;
case 3:
v = i / 3;
h = i % 3 - 2;
break;
case 4:
v = i / 3 - 1;
h = i % 3 - 2;
break;
case 0:
v = i / 3 - 1;
h = i % 3 - 1;
break;
case 8:
v = i / 3 - 1;
h = i % 3;
break;
case 5:
v = i / 3 - 2;
h = i % 3 - 2;
break;
case 6:
v = i / 3 - 2;
h = i % 3 - 1;
break;
case 7:
v = i / 3 - 2;
h = i % 3;
break;
}
sum += Math.abs(v) + Math.abs(h);
}
return sum;
}
}
}
اگر هم کد آمادشو میخوای که 8 puzzle java code بزنی تو اینترنت هست