第二个问题:这回是用船把这三个僧侣和三个鬼运到河对面,但是千万要注意,当一边的鬼的数量多于僧侣,鬼就会吃掉僧侣。比上一题难了点,不过还是可以解开的吧!
逻辑处理类
- 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;
- }
- }
输出结果:
原地方--->目的地:
人 鬼
目的地--->向原地方:
人
原地方--->目的地:
鬼 鬼
目的地--->向原地方:
鬼
原地方--->目的地:
人 人
目的地--->向原地方:
鬼 人
原地方--->目的地:
人 人
目的地--->向原地方:
鬼
原地方--->目的地:
鬼 鬼
目的地--->向原地方:
人
原地方--->目的地:
鬼 人
人 鬼
目的地--->向原地方:
人
原地方--->目的地:
鬼 鬼
目的地--->向原地方:
鬼
原地方--->目的地:
人 人
目的地--->向原地方:
鬼 人
原地方--->目的地:
人 人
目的地--->向原地方:
鬼
原地方--->目的地:
鬼 鬼
目的地--->向原地方:
人
原地方--->目的地:
鬼 人
0
收藏
转载于:https://blog.51cto.com/caixia/771232