由○○○ ●●● 变为 ●●● ○○○     
      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.   

    程序运行没问题
    只是看不懂哦
    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; 

      

  2.   

    LZ要结合整个程序看
    首先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)) 会进入这个判断