由○○○ ●●● 变为 ●●● ○○○
1 一次只能移动一个棋子;
(2)棋子可以向空格中移动,也可以跳过一个对方的棋子进入空格,但不能向后跳,也不能跳过两个子
/**
* 1 1 1 0 2 2 2
*
*/
public class MyTest {
int[] cell = new int[] { 1, 1, 1, 0, 2, 2, 2 }; public boolean judge(int cellW, int pointFlag, int a) { if (cellW < 0 || cellW > 6)// 不存在
return false; if ((cell[cellW] == 1 && cellW > pointFlag)
|| (cell[cellW] == 2 && cellW < pointFlag)) // 不能后退
return false; if (Math.abs(cellW - pointFlag) == 2) { // 不能跳过同类
if (cellW - pointFlag > 0 && cell[cellW] == cell[cellW - 1])
return false;
if (cellW - pointFlag < 0 && cell[cellW] == cell[cellW + 1])
return false;
} int temp = cell[cellW];// 下面这一段不懂感觉第一步就返回false了,没法执行了
cell[cellW] = 0;
if ((pointFlag - 1) >= 0 && temp == cell[pointFlag - 1]
|| (pointFlag + 1) <= 6 && temp == cell[pointFlag + 1]) {
int i;
if (temp == 1) {
cell[cellW] = temp;
for (i = pointFlag; i <= 6; i++)
if (cell[i] == 2)
break;
if (i <= 6)
return false;
}
if (temp == 2) {
cell[cellW] = temp;
for (i = pointFlag; i >= 0; i--)
if (cell[i] == 1)
break;
if (i >= 0)
return false;
}
}
cell[cellW] = temp; //if (a == 2)
//return true; cell[pointFlag] = cell[cellW];
cell[cellW] = 0; if (cell[0] + cell[1] + cell[2] == 6
&& cell[4] + cell[5] + cell[6] == 3) {
cell[cellW] = cell[pointFlag];
cell[pointFlag] = 0;
return true;
} if (judge(cellW - 2, cellW, 2) || judge(cellW - 1, cellW, 2)
|| judge(cellW + 1, cellW, 2) || judge(cellW + 2, cellW, 2)) { // 下一步有效
cell[cellW] = cell[pointFlag];
cell[pointFlag] = 0;
} else {
cell[cellW] = cell[pointFlag];
cell[pointFlag] = 0;
return false;
}
return true; } public void t() {
int sum_q = 0;
int sum_h = 0;
int pointFlag = 3; // 记录空单元的位置 System.out.println("开始执行前,数组中元素的情况");
for (int i = 0; i < 7; i++) {
System.out.print(cell[i] + " ");
}
System.out.print("\n");
int m = 0;
while (true) {
m++;
sum_q = cell[0] + cell[1] + cell[2];
sum_h = cell[4] + cell[5] + cell[6];
if (sum_q == 6 && sum_h == 3)// 完成任务时的标记 222 111
break; if (judge(pointFlag - 2, pointFlag, 1)) { // 判断空单元左侧第2个数
// System.out.println("this is - 2");
cell[pointFlag] = cell[pointFlag - 2];
cell[pointFlag - 2] = 0;
pointFlag = pointFlag - 2; } else if (judge(pointFlag - 1, pointFlag, 1)) {// 判断空单元左侧第1个数
// System.out.println("this is - 1" + pointFlag);
cell[pointFlag] = cell[pointFlag - 1];
cell[pointFlag - 1] = 0;
pointFlag = pointFlag - 1;
} else if (judge(pointFlag + 1, pointFlag, 1)) {// 判断空单元右侧第1个数
// System.out.println("this is + 1");
cell[pointFlag] = cell[pointFlag + 1];
cell[pointFlag + 1] = 0;
pointFlag = pointFlag + 1;
} else if (judge(pointFlag + 2, pointFlag, 1)) {// 判断空单元侧第2个数
// System.out.println("this is + 2");
cell[pointFlag] = cell[pointFlag + 2];
cell[pointFlag + 2] = 0;
pointFlag = pointFlag + 2;
}
System.out.println("这是第" + m
+ "步------------------------------------------");
for (int i = 0; i < 7; i++) {
System.out.print(cell[i] + " ");
}
System.out.print("\n");
}
System.out.println("运行结束后,数组中元素的情况");
for (int i = 0; i < 7; i++) {
System.out.print(cell[i] + " ");
}
} public static void main(String[] a) {
MyTest pp = new MyTest();
pp.t();
}
}
1 一次只能移动一个棋子;
(2)棋子可以向空格中移动,也可以跳过一个对方的棋子进入空格,但不能向后跳,也不能跳过两个子
/**
* 1 1 1 0 2 2 2
*
*/
public class MyTest {
int[] cell = new int[] { 1, 1, 1, 0, 2, 2, 2 }; public boolean judge(int cellW, int pointFlag, int a) { if (cellW < 0 || cellW > 6)// 不存在
return false; if ((cell[cellW] == 1 && cellW > pointFlag)
|| (cell[cellW] == 2 && cellW < pointFlag)) // 不能后退
return false; if (Math.abs(cellW - pointFlag) == 2) { // 不能跳过同类
if (cellW - pointFlag > 0 && cell[cellW] == cell[cellW - 1])
return false;
if (cellW - pointFlag < 0 && cell[cellW] == cell[cellW + 1])
return false;
} int temp = cell[cellW];// 下面这一段不懂感觉第一步就返回false了,没法执行了
cell[cellW] = 0;
if ((pointFlag - 1) >= 0 && temp == cell[pointFlag - 1]
|| (pointFlag + 1) <= 6 && temp == cell[pointFlag + 1]) {
int i;
if (temp == 1) {
cell[cellW] = temp;
for (i = pointFlag; i <= 6; i++)
if (cell[i] == 2)
break;
if (i <= 6)
return false;
}
if (temp == 2) {
cell[cellW] = temp;
for (i = pointFlag; i >= 0; i--)
if (cell[i] == 1)
break;
if (i >= 0)
return false;
}
}
cell[cellW] = temp; //if (a == 2)
//return true; cell[pointFlag] = cell[cellW];
cell[cellW] = 0; if (cell[0] + cell[1] + cell[2] == 6
&& cell[4] + cell[5] + cell[6] == 3) {
cell[cellW] = cell[pointFlag];
cell[pointFlag] = 0;
return true;
} if (judge(cellW - 2, cellW, 2) || judge(cellW - 1, cellW, 2)
|| judge(cellW + 1, cellW, 2) || judge(cellW + 2, cellW, 2)) { // 下一步有效
cell[cellW] = cell[pointFlag];
cell[pointFlag] = 0;
} else {
cell[cellW] = cell[pointFlag];
cell[pointFlag] = 0;
return false;
}
return true; } public void t() {
int sum_q = 0;
int sum_h = 0;
int pointFlag = 3; // 记录空单元的位置 System.out.println("开始执行前,数组中元素的情况");
for (int i = 0; i < 7; i++) {
System.out.print(cell[i] + " ");
}
System.out.print("\n");
int m = 0;
while (true) {
m++;
sum_q = cell[0] + cell[1] + cell[2];
sum_h = cell[4] + cell[5] + cell[6];
if (sum_q == 6 && sum_h == 3)// 完成任务时的标记 222 111
break; if (judge(pointFlag - 2, pointFlag, 1)) { // 判断空单元左侧第2个数
// System.out.println("this is - 2");
cell[pointFlag] = cell[pointFlag - 2];
cell[pointFlag - 2] = 0;
pointFlag = pointFlag - 2; } else if (judge(pointFlag - 1, pointFlag, 1)) {// 判断空单元左侧第1个数
// System.out.println("this is - 1" + pointFlag);
cell[pointFlag] = cell[pointFlag - 1];
cell[pointFlag - 1] = 0;
pointFlag = pointFlag - 1;
} else if (judge(pointFlag + 1, pointFlag, 1)) {// 判断空单元右侧第1个数
// System.out.println("this is + 1");
cell[pointFlag] = cell[pointFlag + 1];
cell[pointFlag + 1] = 0;
pointFlag = pointFlag + 1;
} else if (judge(pointFlag + 2, pointFlag, 1)) {// 判断空单元侧第2个数
// System.out.println("this is + 2");
cell[pointFlag] = cell[pointFlag + 2];
cell[pointFlag + 2] = 0;
pointFlag = pointFlag + 2;
}
System.out.println("这是第" + m
+ "步------------------------------------------");
for (int i = 0; i < 7; i++) {
System.out.print(cell[i] + " ");
}
System.out.print("\n");
}
System.out.println("运行结束后,数组中元素的情况");
for (int i = 0; i < 7; i++) {
System.out.print(cell[i] + " ");
}
} public static void main(String[] a) {
MyTest pp = new MyTest();
pp.t();
}
}
只是看不懂哦
int temp = cell[cellW];// 下面这一段不懂感觉第一步就返回false了,没法执行了
cell[cellW] = 0;
if ((pointFlag - 1) >= 0 && temp == cell[pointFlag - 1]
|| (pointFlag + 1) <= 6 && temp == cell[pointFlag + 1]) {
int i;
if (temp == 1) {
cell[cellW] = temp;
for (i = pointFlag; i <= 6; i++)
if (cell[i] == 2)
break;
if (i <= 6)
return false;
}
if (temp == 2) {
cell[cellW] = temp;
for (i = pointFlag; i >= 0; i--)
if (cell[i] == 1)
break;
if (i >= 0)
return false;
}
首先t方法的
else if (judge(pointFlag - 1, pointFlag, 1)) {// 判断空单元左侧第1个数
进入judge方法(此时pointFlag=3,初始值)
然后走到
int temp = cell[cellW];// 下面这一段不懂感觉第一步就返回false了,没法执行了
//cellW=pointFlag - 1=3-1=2,所以这里temp=1
cell[cellW] = 0; //注意这里,此时cell[2]=0
if ((pointFlag - 1) >= 0 && temp == cell[pointFlag - 1] //此时temp!=cell[2]
|| (pointFlag + 1) <= 6 && temp == cell[pointFlag + 1]) {
//所以这个判断没有进入,怎么会返回false呢
}
然后
cell[cellW] = temp; //这里恢复cell[2]//if (a == 2)
//return true; cell[pointFlag] = cell[cellW];
cell[cellW] = 0;
这里把cell[2]和cell[3]作值交换
然后递归判断,此时judge(cellW + 2, cellW, 2)应该是有效的(具体就不再分析了)
所以返回返回true,
即第一步else if (judge(pointFlag - 1, pointFlag, 1)) 会进入这个判断