加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

编程解决各种问题(二) ----------------Flash 经典智力游戏(

发布时间:2020-12-15 06:55:33 所属栏目:百科 来源:网络整理
导读:第二个问题:这回是用船把这三个僧侣和三个鬼运到河对面,但是千万要注意,当一边的鬼的数量多于僧侣,鬼就会吃掉僧侣。比上一题难了点,不过还是可以解开的吧! http://www.chinaren.com/20050330/n224935292.shtml 逻辑处理类 import java.util.ArrayList;

第二个问题:这回是用船把这三个僧侣和三个鬼运到河对面,但是千万要注意,当一边的鬼的数量多于僧侣,鬼就会吃掉僧侣。比上一题难了点,不过还是可以解开的吧!


http://www.chinaren.com/20050330/n224935292.shtml


逻辑处理类

import java.util.ArrayList;


public class Flash {

	static ArrayList<Body> curList = new ArrayList<Body>();
	static ArrayList<Body> tarList = new ArrayList<Body>();
	
	static boolean bFlag = false;								//用于 标记船在哪里   false表示在原地方 true表示在目的地
	
	static ArrayList<Body> list = new ArrayList<Body>();
	
	public static void main(String[] args) {
		
		//初始化3个人
		Body p1 = new Body();
		p1.setIndex(Body.PEOPLE);
		
		Body p2 = new Body();
		p2.setIndex(Body.PEOPLE);
		
		Body p3 = new Body();
		p3.setIndex(Body.PEOPLE);
		
		//初始化3个鬼
		Body g1 = new Body();
		g1.setIndex(Body.GHOST);
		
		Body g2 = new Body();
		g2.setIndex(Body.GHOST);
		
		Body g3 = new Body();
		g3.setIndex(Body.GHOST);
		
		curList.add(p1);
		curList.add(p2);
		curList.add(p3);
		curList.add(g1);
		curList.add(g2);
		curList.add(g3);
		
		new Thread(){
			public void run(){
				while(tarList.toArray().length < 6){
					if(bFlag){
						//目的地----原地方
						Transportation(tarList,curList,1);
					}else{
						//原地方----目的地
						Transportation(curList,tarList,0);
					}
				}
			}
		}.start();
	}
	
	public static void Transportation(ArrayList<Body> cur,ArrayList<Body> tar,int dirFlag){
		//方案是否可行
		boolean flag = false;
		Body temp1 = null;
		Body temp2 = null;
		
		if(list.toArray().length == 1){
			temp1 = list.get(0);
		}else if(list.toArray().length == 2){
			temp1 = list.get(0);
			temp2 = list.get(1);
		}

		//如果运两个
		for(Body b1 : cur){
			for(Body b2 : cur){
				if(!b2.equals(b1)){
					
					if(temp1 == null){
						temp1 = new Body();
						temp1.setIndex(-1);
					}
					
					if(temp2 == null){
						temp2 = new Body();
						temp2.setIndex(-1);
					}
					
					if(!(((temp1.getIndex() == b1.getIndex()) && (temp2.getIndex() == b2.getIndex())) ||
							((temp2.getIndex() == b1.getIndex()) && (temp1.getIndex() == b2.getIndex())))){
						
						int curBi = 0;		//剩下的人得数量
						int curGi = 0;		//剩下的鬼的数量
						
						for(Body bb : cur){
							if(bb.getIndex() == Body.PEOPLE){
								curBi ++;
							}else{
								curGi ++;
							}
						}
						
						if(b1.getIndex() == Body.PEOPLE){
							curBi --;
						}else{
							curGi --;
						}
						
						if(b2.getIndex() == Body.PEOPLE){
							curBi --;
						}else{
							curGi --;
						}
						
						int tarBi = 0;		//剩下的人得数量
						int tarGi = 0;		//剩下的鬼的数量
						
						for(Body bb : tar){
							if(bb.getIndex() == Body.PEOPLE){
								tarBi ++;
							}else{
								tarGi ++;
							}
						}
						
						if(b1.getIndex() == Body.PEOPLE){
							tarBi ++;
						}else{
							tarGi ++;
						}
						
						if(b2.getIndex() == Body.PEOPLE){
							tarBi ++;
						}else{
							tarGi ++;
						}
						
						//如果河岸两边鬼的数量都小于或等于人的数量,说明方案可行
						if((tarGi <= tarBi || tarBi == 0)&& (curGi <= curBi || curBi == 0)){
							flag = true;	
							temp1 = b1;
							temp2 = b2;
							break;
						}
					}
					
				}
			}
			
			if(flag){
				break;
			}
		}
		if(flag){
			tar.add(temp1);
			tar.add(temp2);
			cur.remove(temp1);
			cur.remove(temp2);
			list.removeAll(list);
			list.add(temp1);
			list.add(temp2);
			showResult(list,dirFlag);
			if(bFlag){
				bFlag = false;
			}else{
				bFlag = true;
			}
		}else{
			if(temp2 != null){
				temp1 = new Body();
				temp1.setIndex(-1);
			}
			
			//如果运一个
			for(Body b : cur){
				if(temp1.getIndex() != b.getIndex()){
					
					int curBi = 0;		//剩下的人得数量
					int curGi = 0;		//剩下的鬼的数量
					
					for(Body bb : cur){
						if(bb.getIndex() == Body.PEOPLE){
							curBi ++;
						}else{
							curGi ++;
						}
					}
					
					if(b.getIndex() == Body.PEOPLE){
						curBi --;
					}else{
						curGi --;
					}
					
					int tarBi = 0;		//剩下的人得数量
					int tarGi = 0;		//剩下的鬼的数量
					
					for(Body bb : tar){
						if(bb.getIndex() == Body.PEOPLE){
							tarBi ++;
						}else{
							tarGi ++;
						}
					}
					
					if(b.getIndex() == Body.PEOPLE){
						tarBi ++;
					}else{
						tarGi ++;
					}
					
					//如果河岸两边鬼的数量都小于或等于人的数量,说明方案可行
					if((tarGi <= tarBi || tarBi == 0)&& (curGi <= curBi || curBi == 0)){
						flag = true;
						temp1 = b;
						break;
					}
				}
			}
			if(flag){
				tar.add(temp1);
				cur.remove(temp1);
				list.removeAll(list);
				list.add(temp1);
				showResult(list,dirFlag);
				if(bFlag){
					bFlag = false;
				}else{
					bFlag = true;
				}
			}
		}
	}
	
	public static void showResult(ArrayList<Body> list,int nflag){
		if(nflag == 0){
			
			System.out.println("原地方--->目的地:");
			
			for(Body b : list){
				switch(b.getIndex()){
				case Body.PEOPLE:
					System.out.print("人     ");
					break;
				case Body.GHOST:
					System.out.print("鬼     ");
					break;
				}
			}
		}else if(nflag == 1){
			
			System.out.println("目的地--->向原地方:");
			
			for(Body b : list){
				switch(b.getIndex()){
				case Body.PEOPLE:
					System.out.print("人     ");
					break;
				case Body.GHOST:
					System.out.print("鬼     ");
					break;
				}
			}
		}
		System.out.println();
	}
}

public class Body {
	public int index;
	
	public static final int PEOPLE = 0;
	public static final int GHOST = 1;

	public int getIndex() {
		return index;
	}

	public void setIndex(int index) {
		this.index = index;
	}
}



输出结果:

原地方--->目的地: 人 ? ? 鬼 ? ?? 目的地--->向原地方: 人 ? ?? 原地方--->目的地: 鬼 ? ? 鬼 ? ?? 目的地--->向原地方: 鬼 ? ?? 原地方--->目的地: 人 ? ? 人 ? ?? 目的地--->向原地方: 鬼 ? ? 人 ? ?? 原地方--->目的地: 人 ? ? 人 ? ?? 目的地--->向原地方: 鬼 ? ?? 原地方--->目的地: 鬼 ? ? 鬼 ? ?? 目的地--->向原地方: 人 ? ?? 原地方--->目的地: 鬼 ? ? 人 ? ??

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读