最近两天在网上看了一些青蛙过河的算法。。。。。
不知道是我理解有问题,还是他们写的有问题。。。。。好坑啊!!!!反正是得不到正确的结果
自己着摸着也弄了一个
package frog;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class OverRiver {
private static final String LEFT_LOG = "<-";
private static final String RIGHT_LOG = "->";
private static final String NOT_NAME = "O";
private boolean isfinish = false;
private int theNumberOfStone;
private List<Frog> frogs;
public OverRiver(int theNumberOfStone){
this.theNumberOfStone = theNumberOfStone;
frogs = new ArrayList<Frog>();
init(theNumberOfStone);
}
private void init(int theNumberOfStone){
for(int i=1;i<=theNumberOfStone;i++){
if(i<((theNumberOfStone+1)/2)){
frogs.add(new Frog(RIGHT_LOG, Direction.TO_THE_RIGHT));
}else if(i>((theNumberOfStone+1)/2)){
frogs.add(new Frog(LEFT_LOG, Direction.TO_THE_LEFT));
}else{
frogs.add(new Frog(NOT_NAME, Direction.I_AM_NULL));
}
}
printOut();
}
public void overRiverStart(){
if(!isfinish){
//判断向右的青蛙能否跳跃过向左青蛙
for(int i = 0; i < frogs.size(); i++){
Frog frog = frogs.get(i);
if(frog.getDirection()==Direction.TO_THE_RIGHT){
if(i==(frogs.size()-1)){
continue;
}
int nextDir = frogs.get(i+1).getDirection();
if(nextDir==Direction.TO_THE_LEFT){
if(i==(frogs.size()-2)){
continue;
}
if(frogs.get(i+2).getDirection()==Direction.I_AM_NULL){
change(frogs.get(i+2), frog);
printOut();
overRiverStart();
break;
}
}
}
}
//判断向左的青蛙能否跳跃过向右青蛙
for(int i = 0; i < frogs.size(); i++){
Frog frog = frogs.get(i);
if(frog.getDirection()==Direction.TO_THE_LEFT){
if(i==0){
continue;
}
int nextDir = frogs.get(i-1).getDirection();
if(nextDir==Direction.TO_THE_RIGHT){
if(i==1){
continue;
}
if(frogs.get(i-2).getDirection()==Direction.I_AM_NULL){
change(frogs.get(i-2), frog);
printOut();
overRiverStart();
break;
}
}
}
}
//判断前三个中向右的青蛙能否向右移动一位,后四个中向左的青蛙能否向左移动一位
for (int i = 0; i < frogs.size(); i++) {
Frog frog = frogs.get(i);
if(i<((frogs.size()-1)/2)){
if(frog.getDirection()==Direction.TO_THE_RIGHT){
if(frogs.get(i+1).getDirection()==Direction.I_AM_NULL){
change(frogs.get(i+1), frog);
printOut();
overRiverStart();
break;
}
}
}
if(i>=((frogs.size()-1)/2)){
if(frog.getDirection()==Direction.TO_THE_LEFT){
if(frogs.get(i-1).getDirection()==Direction.I_AM_NULL){
change(frogs.get(i-1), frog);
printOut();
overRiverStart();
break;
}
}
}
}
//判断前三个中向左的青蛙能否向左移动一位,后四个中向右的青蛙能否向右移动一位
for (int i = 0; i < frogs.size(); i++) {
Frog frog = frogs.get(i);
if(i<((frogs.size()-1)/2)){
if(frog.getDirection()==Direction.TO_THE_LEFT){
if(i==0){
continue;
}
if(frogs.get(i-1).getDirection()==Direction.I_AM_NULL){
change(frogs.get(i-1), frog);
printOut();
overRiverStart();
break;
}
}
}
if(i>=((frogs.size()-1)/2)){
if(frog.getDirection()==Direction.TO_THE_RIGHT){
if(i==frogs.size()-1){
continue;
}
if(frogs.get(i+1).getDirection()==Direction.I_AM_NULL){
change(frogs.get(i+1), frog);
printOut();
issuccess();
overRiverStart();
break;
}
}
}
}
}
}
public void change(Frog f1 , Frog f2){
f1.setDirection(f2.getDirection());
f1.setFrogName(f2.getFrogName());
f2.setDirection(Direction.I_AM_NULL);
f2.setFrogName(NOT_NAME);
}
public void printOut(){
for (Iterator iterator = frogs.iterator(); iterator.hasNext();) {
Frog frog = (Frog) iterator.next();
System.out.print(frog.getFrogName()+" ");
}
System.out.println();
}
public void issuccess(){
int num=0;
for (int i = 0; i < (frogs.size()+1)/2; i++) {
if(i<(frogs.size()-1)/2){
if(frogs.get(i).getDirection()==1){
num++;
}
}else {
if(frogs.get(i).getDirection()==0){
num++;
}
}
}
if(num==(frogs.size()+1)/2){
isfinish = true;
}else{
isfinish= false;
}
}
}
结果:
-> -> -> O <- <- <-
-> -> O -> <- <- <-
-> -> <- -> O <- <-
-> -> <- -> <- O <-
-> -> <- O <- -> <-
-> O <- -> <- -> <-
O -> <- -> <- -> <-
<- -> O -> <- -> <-
<- -> <- -> O -> <-
<- -> <- -> <- -> O
<- -> <- -> <- O ->
<- -> <- O <- -> ->
<- O <- -> <- -> ->
<- <- O -> <- -> ->
<- <- <- -> O -> ->
<- <- <- O -> -> ->