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


逻辑处理类
  1. import java.util.ArrayList;  
  2.   
  3.   
  4. public class Flash {  
  5.   
  6.     static ArrayList<Body> curList = new ArrayList<Body>();  
  7.     static ArrayList<Body> tarList = new ArrayList<Body>();  
  8.       
  9.     static boolean bFlag = false;                               //用于 标记船在哪里   false表示在原地方 true表示在目的地   
  10.       
  11.     static ArrayList<Body> list = new ArrayList<Body>();  
  12.       
  13.     public static void main(String[] args) {  
  14.           
  15.         //初始化3个人   
  16.         Body p1 = new Body();  
  17.         p1.setIndex(Body.PEOPLE);  
  18.           
  19.         Body p2 = new Body();  
  20.         p2.setIndex(Body.PEOPLE);  
  21.           
  22.         Body p3 = new Body();  
  23.         p3.setIndex(Body.PEOPLE);  
  24.           
  25.         //初始化3个鬼   
  26.         Body g1 = new Body();  
  27.         g1.setIndex(Body.GHOST);  
  28.           
  29.         Body g2 = new Body();  
  30.         g2.setIndex(Body.GHOST);  
  31.           
  32.         Body g3 = new Body();  
  33.         g3.setIndex(Body.GHOST);  
  34.           
  35.         curList.add(p1);  
  36.         curList.add(p2);  
  37.         curList.add(p3);  
  38.         curList.add(g1);  
  39.         curList.add(g2);  
  40.         curList.add(g3);  
  41.           
  42.         new Thread(){  
  43.             public void run(){  
  44.                 while(tarList.toArray().length < 6){  
  45.                     if(bFlag){  
  46.                         //目的地----原地方   
  47.                         Transportation(tarList,curList,1);  
  48.                     }else{  
  49.                         //原地方----目的地   
  50.                         Transportation(curList,tarList,0);  
  51.                     }  
  52.                 }  
  53.             }  
  54.         }.start();  
  55.     }  
  56.       
  57.     public static void Transportation(ArrayList<Body> cur,ArrayList<Body> tar,int dirFlag){  
  58.         //方案是否可行   
  59.         boolean flag = false;  
  60.         Body temp1 = null;  
  61.         Body temp2 = null;  
  62.           
  63.         if(list.toArray().length == 1){  
  64.             temp1 = list.get(0);  
  65.         }else if(list.toArray().length == 2){  
  66.             temp1 = list.get(0);  
  67.             temp2 = list.get(1);  
  68.         }  
  69.   
  70.         //如果运两个   
  71.         for(Body b1 : cur){  
  72.             for(Body b2 : cur){  
  73.                 if(!b2.equals(b1)){  
  74.                       
  75.                     if(temp1 == null){  
  76.                         temp1 = new Body();  
  77.                         temp1.setIndex(-1);  
  78.                     }  
  79.                       
  80.                     if(temp2 == null){  
  81.                         temp2 = new Body();  
  82.                         temp2.setIndex(-1);  
  83.                     }  
  84.                       
  85.                     if(!(((temp1.getIndex() == b1.getIndex()) && (temp2.getIndex() == b2.getIndex())) ||  
  86.                             ((temp2.getIndex() == b1.getIndex()) && (temp1.getIndex() == b2.getIndex())))){  
  87.                           
  88.                         int curBi = 0;      //剩下的人得数量   
  89.                         int curGi = 0;      //剩下的鬼的数量   
  90.                           
  91.                         for(Body bb : cur){  
  92.                             if(bb.getIndex() == Body.PEOPLE){  
  93.                                 curBi ++;  
  94.                             }else{  
  95.                                 curGi ++;  
  96.                             }  
  97.                         }  
  98.                           
  99.                         if(b1.getIndex() == Body.PEOPLE){  
  100.                             curBi --;  
  101.                         }else{  
  102.                             curGi --;  
  103.                         }  
  104.                           
  105.                         if(b2.getIndex() == Body.PEOPLE){  
  106.                             curBi --;  
  107.                         }else{  
  108.                             curGi --;  
  109.                         }  
  110.                           
  111.                         int tarBi = 0;      //剩下的人得数量   
  112.                         int tarGi = 0;      //剩下的鬼的数量   
  113.                           
  114.                         for(Body bb : tar){  
  115.                             if(bb.getIndex() == Body.PEOPLE){  
  116.                                 tarBi ++;  
  117.                             }else{  
  118.                                 tarGi ++;  
  119.                             }  
  120.                         }  
  121.                           
  122.                         if(b1.getIndex() == Body.PEOPLE){  
  123.                             tarBi ++;  
  124.                         }else{  
  125.                             tarGi ++;  
  126.                         }  
  127.                           
  128.                         if(b2.getIndex() == Body.PEOPLE){  
  129.                             tarBi ++;  
  130.                         }else{  
  131.                             tarGi ++;  
  132.                         }  
  133.                           
  134.                         //如果河岸两边鬼的数量都小于或等于人的数量,说明方案可行   
  135.                         if((tarGi <= tarBi || tarBi == 0)&& (curGi <= curBi || curBi == 0)){  
  136.                             flag = true;      
  137.                             temp1 = b1;  
  138.                             temp2 = b2;  
  139.                             break;  
  140.                         }  
  141.                     }  
  142.                       
  143.                 }  
  144.             }  
  145.               
  146.             if(flag){  
  147.                 break;  
  148.             }  
  149.         }  
  150.         if(flag){  
  151.             tar.add(temp1);  
  152.             tar.add(temp2);  
  153.             cur.remove(temp1);  
  154.             cur.remove(temp2);  
  155.             list.removeAll(list);  
  156.             list.add(temp1);  
  157.             list.add(temp2);  
  158.             showResult(list,dirFlag);  
  159.             if(bFlag){  
  160.                 bFlag = false;  
  161.             }else{  
  162.                 bFlag = true;  
  163.             }  
  164.         }else{  
  165.             if(temp2 != null){  
  166.                 temp1 = new Body();  
  167.                 temp1.setIndex(-1);  
  168.             }  
  169.               
  170.             //如果运一个   
  171.             for(Body b : cur){  
  172.                 if(temp1.getIndex() != b.getIndex()){  
  173.                       
  174.                     int curBi = 0;      //剩下的人得数量   
  175.                     int curGi = 0;      //剩下的鬼的数量   
  176.                       
  177.                     for(Body bb : cur){  
  178.                         if(bb.getIndex() == Body.PEOPLE){  
  179.                             curBi ++;  
  180.                         }else{  
  181.                             curGi ++;  
  182.                         }  
  183.                     }  
  184.                       
  185.                     if(b.getIndex() == Body.PEOPLE){  
  186.                         curBi --;  
  187.                     }else{  
  188.                         curGi --;  
  189.                     }  
  190.                       
  191.                     int tarBi = 0;      //剩下的人得数量   
  192.                     int tarGi = 0;      //剩下的鬼的数量   
  193.                       
  194.                     for(Body bb : tar){  
  195.                         if(bb.getIndex() == Body.PEOPLE){  
  196.                             tarBi ++;  
  197.                         }else{  
  198.                             tarGi ++;  
  199.                         }  
  200.                     }  
  201.                       
  202.                     if(b.getIndex() == Body.PEOPLE){  
  203.                         tarBi ++;  
  204.                     }else{  
  205.                         tarGi ++;  
  206.                     }  
  207.                       
  208.                     //如果河岸两边鬼的数量都小于或等于人的数量,说明方案可行   
  209.                     if((tarGi <= tarBi || tarBi == 0)&& (curGi <= curBi || curBi == 0)){  
  210.                         flag = true;  
  211.                         temp1 = b;  
  212.                         break;  
  213.                     }  
  214.                 }  
  215.             }  
  216.             if(flag){  
  217.                 tar.add(temp1);  
  218.                 cur.remove(temp1);  
  219.                 list.removeAll(list);  
  220.                 list.add(temp1);  
  221.                 showResult(list,dirFlag);  
  222.                 if(bFlag){  
  223.                     bFlag = false;  
  224.                 }else{  
  225.                     bFlag = true;  
  226.                 }  
  227.             }  
  228.         }  
  229.     }  
  230.       
  231.     public static void showResult(ArrayList<Body> list,int nflag){  
  232.         if(nflag == 0){  
  233.               
  234.             System.out.println("原地方--->目的地:");  
  235.               
  236.             for(Body b : list){  
  237.                 switch(b.getIndex()){  
  238.                 case Body.PEOPLE:  
  239.                     System.out.print("人     ");  
  240.                     break;  
  241.                 case Body.GHOST:  
  242.                     System.out.print("鬼     ");  
  243.                     break;  
  244.                 }  
  245.             }  
  246.         }else if(nflag == 1){  
  247.               
  248.             System.out.println("目的地--->向原地方:");  
  249.               
  250.             for(Body b : list){  
  251.                 switch(b.getIndex()){  
  252.                 case Body.PEOPLE:  
  253.                     System.out.print("人     ");  
  254.                     break;  
  255.                 case Body.GHOST:  
  256.                     System.out.print("鬼     ");  
  257.                     break;  
  258.                 }  
  259.             }  
  260.         }  
  261.         System.out.println();  
  262.     }  
  263. }  
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(); } }
  1. public class Body {  
  2.     public int index;  
  3.       
  4.     public static final int PEOPLE = 0;  
  5.     public static final int GHOST = 1;  
  6.   
  7.     public int getIndex() {  
  8.         return index;  
  9.     }  
  10.   
  11.     public void setIndex(int index) {  
  12.         this.index = index;  
  13.     }  
  14. }  
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

收藏

彩霞飞飞

182篇文章,31W+人气,0粉丝