初始正方形中的带圆圈的数字是可以移动到沿着行的其他正方形的标记。 在拼图的每个步骤,可以移动标记的正方形中由当前占据的整数指示的方格数。 标记可以沿着该行向左或向右移动,但可以不移动经过任一端。 例如,唯一合法的第一步是将标记向右移动三个方格,因为没有空间向左移动三个空格。
拼图的目标是将标记移动到行的远端的0。
要求: 用递归 或 栈或者队列实现编程。
如果圆圈能够移动到最后0的位置,返回true,否则返回false。
程序要适应任何大小的方格数,并且方格里的数字是随机的,范围是[1,9]。
import java.util.ArrayList;
import java.util.Random;
public class HomeWork {
/**
* 进行数组第一次的移动
*
* @param a ArrayList类型的数组
* @param tmp 开始位置的下标
* @return
* */
public static int move(ArrayList<Integer> a,int tmp) {
if((tmp+a.get(tmp))<=a.size()-1){
tmp=tmp+a.get(tmp);
}
else{
if(tmp-a.get(tmp)>=0){
tmp=tmp-a.get(tmp);
}
}
return tmp;
}
/**
* 通过调用move函数让数组进行移动
*
* @param a ArrayList类型的数组
* @param tmp 开始位置的下标
* @return
*
* */
public static boolean puzzle(ArrayList<Integer> a,int tmp){
while(tmp!=a.size()-1){
if(a.get(tmp)+tmp>a.size()-1&&tmp-a.get(tmp)<0){
break;
}
tmp=move(a, tmp);
}
if(tmp==a.size()-1){
return true;
}
else{
return false;
}
}
/**
* 创建一个随机数组
*
* @return
* */
public static ArrayList<Integer> random(){
ArrayList<Integer> a=new ArrayList<Integer> ();
Random b=new Random();
a.add(b.nextInt(10));
a.add(b.nextInt(10));
a.add(b.nextInt(10));
a.add(b.nextInt(10));
a.add(b.nextInt(10));
a.add(b.nextInt(10));
a.add(b.nextInt(10));
a.add(b.nextInt(10));
a.add(b.nextInt(10));
a.add(b.nextInt(10));
a.add(b.nextInt(10));
return a;
}
public static void main(String[] args) {
ArrayList<Integer> a=random();
System.out.println(puzzle(a, 0));
}
}