关于青蛙过河的问题:
两群青蛙,左右三只,中间有一块空地,左边只能向右跳,右边的只能向左跳,一次只能跳一格或者跨过一个障碍跳一格。
这个有两种思路,一种是先想清楚什么时候会阻塞,这个问题我们可以这样考虑,如果要这些青蛙都不能动的话,那么我们假设有两个同向的青蛙不在它本来的地方却又没有达到对岸的时候相邻在一起了,那么我们可以知道,这个时候就阻塞了,因为后面动从而造成这个局面的青蛙势必是从另一个方向过来的,也就是说,这两个相邻的青蛙的前进方向上没有空位,那么就肯定会造成阻塞了。这里没有问题的话,我们逆推回去,那么如果是右,左,空,右的情况的时候,其实没有什么好的办法,只能是右边那个过来空的地方,或者是右的右边有左方向的青蛙过来,但是不管怎么样,这里肯定是会阻塞的了,就是说空的左边是左,右边是右,这样就肯定不行的了。那么我们要怎么做也就很清楚了,判断好每一步,如果可以跳着走就跳着走,不过每一次走之前都要检测下一步会不会形成空的左边是左右边是右的情况。
还有一种思路就是纯粹的走迷宫,就是用深度二叉树的思想,只要走不通就回头走,就是说如果遇到阻塞的情况,那就说明上一步有问题,就返回就好。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class FrogProblem {
public static List<Integer> list = new ArrayList<Integer>();
public static void main(String[] args) {
int a[] = {1,1,1,0,-1,-1,-1};
frogSwip(a);
}
public static void frogSwip(int num[]){
if(num[0]+num[1]+num[2]==-3&&num[4]+num[5]+num[6]==3){
for (int i = 0; i < list.size()-1; i = i+2) {
System.out.println("第"+(i+2)/2+"次:"+list.get(i)+"和"+list.get(i+1)+"交换");
}
System.exit(0);
}
int base = 0;
for (int i = 0; i < num.length; i++) {
if(num[i]==0){
base = i;
}
}
if(base>1&&num[base-2]==1){ //右边跳两个
num[base] = 1;
num[base-2] = 0;
list.add(base);
list.add(base-2);
frogSwip(num);
list.remove(list.size()-1);
list.remove(list.size()-1);
num[base] = 0;
num[base-2] = 1;
}
if(base<5){ //左边跳两个
if(num[base+2]==-1){
num[base] = -1;
num[base+2] = 0;
list.add(base);
list.add(base+2);
frogSwip(num);
list.remove(list.size()-1);
list.remove(list.size()-1);
num[base] = 0;
num[base+2] = -1;
}
}
if(base>0&&num[base-1]==1){ //右边跳一个
num[base] = 1;
num[base-1] = 0;
list.add(base);
list.add(base-1);
frogSwip(num);
list.remove(list.size()-1);
list.remove(list.size()-1);
num[base] = 0;
num[base-1] = 1;
}
if(base<6&&num[base+1]==-1){ //左边跳一个
num[base] = -1;
num[base+1] = 0;
list.add(base);
list.add(base+1);
frogSwip(num);
list.remove(list.size()-1);
list.remove(list.size()-1);
num[base] = 0;
num[base+1] = -1;
}
}
}