青蛙过河

最近两天在网上看了一些青蛙过河的算法。。。。。

不知道是我理解有问题,还是他们写的有问题。。。。。好坑啊!!!!反正是得不到正确的结果

自己着摸着也弄了一个

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 -> -> -> 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值