⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ferryboat.java

📁 用谓词表示法表示修道士和野人的问题 在河的左岸有三个修道士
💻 JAVA
字号:
import java.io.*; 
 
 class Religious{
 	 private String name;  //修道士
 	 private boolean left;
 	 private boolean right;
 	 
 	 public Religious(){
 	 	 this.left=true;
 	 	 this.right=false;
 	 	}
 	 
 	 public Religious(String name,boolean left,boolean right){
 	 	 this.name=name;
 	 	 this.left=left;
 	 	 this.right=right;
 	 	}
 	 	
 	 public void setLeft(boolean left){
 	 	 this.left=left;
 	 	}	
 	 	
 	 public void setRight(boolean right){
 	 	 this.right=right;
 	 	}	
 	 
 	 public String getName(){
 	 	 return this.name;
 	 	}
 	 
 	 public boolean isLeft(){
 	 	 return left;
 	 	}        //是否在左岸
 	 
 	 public boolean isRight(){
 	 	 return right;
 	 	}		//是否在右岸
 	}
 	
 class 	WildMan{
 	 private String name;  //野人
 	 private boolean left;
 	 private boolean right;
 	 
 	 public WildMan(){
 	 	 this.left=true;
 	 	 this.right=false;
 	 	}
 	 
 	 public WildMan(String name,boolean left,boolean right){
 	 	 this.name=name;
 	 	 this.left=left;
 	 	 this.right=right;
 	 	}
 	 	
 	 public void setLeft(boolean left){
 	 	 this.left=left;
 	 	}	
 	 	
 	 public void setRight(boolean right){
 	 	 this.right=right;
 	 	}	
 	 
 	 public String getName(){
 	 	 return this.name;
 	 	}
 	 
 	 public boolean isLeft(){
 	 	 return left;
 	 	}        //是否在左岸
 	 
 	 public boolean isRight(){
 	 	 return right;
 	 	}		//是否在右岸
 	}
 	
 public class FerryBoat{
 	 public Religious religious[];
 	 public WildMan wildMan[];
 	 public int lastLR;
 	 public int lastRL;
 	 
 	 public FerryBoat(){
 	 	 this.lastLR=999;
 	 	 this.lastRL=999;
 	 	}
 	 
 	 public int leftMonk(){
 	 	 int sum=0;
 	 	 for(int i=0;i<religious.length;i++)
 	 	   if(religious[i].isLeft())sum++;
 	 	 return sum;  
 	 	}
 	 	
 	 public int rightMonk(){
 	 	 int sum=0;
 	 	 for(int i=0;i<religious.length;i++)
 	 	   if(religious[i].isRight())sum++;
 	 	 return sum;  
 	 	}	
 	 	
 	 public int leftWild(){
 	 	 int sum=0;
 	 	 for(int i=0;i<wildMan.length;i++)
 	 	   if(wildMan[i].isLeft())sum++;
 	 	 return sum;
 	 	}
 	 	
 	 public int rightWild(){
 	 	 int sum=0;
 	 	 for(int i=0;i<wildMan.length;i++)
 	 	   if(wildMan[i].isRight())sum++;
 	 	 return sum;
 	 	}	
 	 	
 	 public void leftRight(Religious x,WildMan y){
 	 	 x.setLeft(false);
 	 	 x.setRight(true);
 	 	 y.setLeft(false);
 	 	 y.setRight(true);
 	 	}	
 	 	
 	 public void leftRight(Religious x1,Religious x2){
 	 	 x1.setLeft(false);
 	 	 x1.setRight(true);
 	 	 x2.setLeft(false);
 	 	 x2.setRight(true);
 	 	}	
 	 	
 	 public void leftRight(WildMan y1,WildMan y2){
 	 	 y1.setLeft(false);
 	 	 y1.setRight(true);
 	 	 y2.setLeft(false);
 	 	 y2.setRight(true);
 	 	}	
 	 	
 	 public void leftRight(Religious x){
 	 	 x.setLeft(false);
 	 	 x.setRight(true);
 	 	}	
 	 	
 	 public void leftRight(WildMan y){
 	 	 y.setLeft(false);
 	 	 y.setRight(true);
 	 	}	
 	 
 	 public void rightLeft(Religious x,WildMan y){
 	 	 x.setLeft(true);
 	 	 x.setRight(false);
 	 	 y.setLeft(true);
 	 	 y.setRight(false);
 	 	}	
 	 	
 	 public void rightLeft(Religious x1,Religious x2){
 	 	 x1.setLeft(true);
 	 	 x1.setRight(false);
 	 	 x2.setLeft(true);
 	 	 x2.setRight(false);
 	 	}	
 	 	
 	 public void rightLeft(WildMan y1,WildMan y2){
 	 	 y1.setLeft(true);
 	 	 y1.setRight(false);
 	 	 y2.setLeft(true);
 	 	 y2.setRight(false);
 	 	}	
 	 	
 	 public void rightLeft(Religious x){
 	 	 x.setLeft(true);
 	 	 x.setRight(false);
 	 	}			
 	 	
 	 public void rightLeft(WildMan y){
 	 	 y.setLeft(true);
 	 	 y.setRight(false);
 	 	}	
 	 	
 	 public int valueLeftRight(){
 	 	 if(leftMonk()!=0&&leftWild()!=0){
 	 	 	 if(rightMonk()+1>=rightWild()+1&&this.lastRL!=8)return 0;
 	 	 	}	
 	 	 if(leftMonk()!=0){
 	 	 	 if(leftMonk()>=2)
 	 	 	    {
 	 	 	     if(leftMonk()-2!=0&&leftMonk()-2>=leftWild()&&this.lastRL!=0)return 1;
 	 	 	     if(leftMonk()-2==0&&this.lastRL!=0)return 1;
 	 	 	    } 
 	 	 	 if(this.lastRL!=1){ 
 	 	 	     if(leftMonk()-1!=0&&leftMonk()-1>=leftWild())return 2;
 	 	 	     if(leftMonk()-1==0)return 2;
 	 	 	    } 
 	 	 	}	
 	 	 if(leftWild()!=0){	
 	 	     if(leftWild()>=2&&this.lastRL!=4){
 	 	     	 if(rightMonk()>=rightWild()+2&&rightMonk()!=0)return 3;
 	 	     	 if(rightMonk()==0)return 3;
 	 	     	}
 	 	     if(this.lastRL!=5){
 	 	     	 if(rightMonk()!=0&&rightMonk()>=rightWild()+1)return 4;
 	 	     	 if(rightMonk()==0)return 4;
 	 	     	}
 	 	    }	 	  
 	 	 return 5;    
 	 	}
 	 	
 	 public int valueRightLeft(){
 	 	 if(rightMonk()!=0){
 	 	 	 if(rightMonk()>=2){
 	 	 	 	 if((rightMonk()-2)!=0&&(rightMonk()-2>=rightWild())&&this.lastLR!=1)return 0;
 	 	 	 	 if((rightMonk()-1)!=0&&(rightMonk()-1>=rightWild())&&(leftMonk()+1>=leftWild())&&this.lastLR!=2)return 1;
 	 	 	 	}	 	 	 	
 	 	 	 if((rightMonk()-1)!=0&&(rightMonk()-1>=rightWild())&&(leftMonk()+1>=leftWild())&&this.lastLR!=2)return 2;
 	 	 	 if(rightMonk()-1==0&&this.lastLR!=2)return 3;
 	 	 	 if(this.lastLR!=0){
 	 	 	 	 if(leftMonk()+1>=leftWild()+1){
 	 	 	 	 	 if(rightMonk()-1!=0&&rightMonk()-1>=rightWild()-1)return 8;
 	 	 	 	 	 if(rightMonk()-1==0)return 8;
 	 	 	 	 	}
 	 	 	 	}
 	 	 	}
 	 	 if(rightWild()!=0){
 	 	 	 if(rightWild()>=2){
 	 	 	 	 if(leftMonk()!=0&&leftWild()+2<=leftMonk()&&this.lastLR!=3)return 4;
 	 	 	 	 if(leftMonk()!=0&&leftWild()+1<=leftMonk()&&this.lastLR!=4)return 5;
 	 	 	 	}
 	 	 	 if(leftMonk()!=0&&leftWild()+1<=leftMonk()&&this.lastLR!=4)return 6;
 	 	 	 if(leftMonk()==0&&lastLR!=4)return 7;	
 	 	 	 if(this.lastLR!=0){
 	 	 	 	 if(leftMonk()+1>=leftWild()+1){
 	 	 	 	 	 if(rightMonk()-1!=0&&rightMonk()-1>=rightWild()-1)return 8;
 	 	 	 	 	 if(rightMonk()-1==0)return 8;
 	 	 	 	 	}
 	 	 	 	}
 	 	 	}
 	 	 return 9;	
 	 	}	
 	 	
 	 public void display(){
 	 	 for(int i=0;i<religious.length;i++){
 	 	 	 if(religious[i].isLeft())System.out.println(religious[i].getName()+" 在左岸上 ");
 	 	 	 else System.out.println(religious[i].getName()+" 在右岸上 ");
 	 	 	}
 	 	 	
 	 	 for(int i=0;i<wildMan.length;i++){
 	 	 	 if(wildMan[i].isLeft())System.out.println(wildMan[i].getName()+" 在左岸上");
 	 	 	 else System.out.println(wildMan[i].getName()+" 在右岸上");
 	 	 	}
 	 	 	
 	 	 System.out.print("此时左岸道士:"+this.leftMonk()+",左岸野人:"+this.leftWild());
 	 	 System.out.println("右岸道士:"+this.rightMonk()+",右岸野人:"+this.rightWild());		
 	 	}
 	 				
 	}
 	
 class test{
 	 public static void main(String args[])throws IOException{
 	 	 FerryBoat f=new FerryBoat();
 	 	 System.out.print("请输入左岸道士数目:");
 	 	 BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
 	 	 int numreligious=Integer.parseInt(br.readLine());
 	 	 System.out.print("请输入左岸野人数目:");
 	 	 int numWildMan=Integer.parseInt(br.readLine());
 	 	 f.religious=new Religious[numreligious];
 	 	 f.wildMan=new WildMan[numWildMan];
 	 	 for(int i=0;i<numreligious;i++)
 	 	   f.religious[i]=new Religious("道士"+(i+1),true,false);
 	 	 for(int i=0;i<numWildMan;i++)
 	 	   f.wildMan[i]=new WildMan("野人"+(i+1),true,false);
 	 	 
         f.display(); 	 	 
         
         while(true){
           System.in.read();
           switch(f.valueLeftRight()){
         	  case 0:
         	     {
         	      int i,j;
         	      for(i=0;i<f.religious.length;i++)
         	         if(f.religious[i].isLeft())break;
         	      for(j=0;j<f.wildMan.length;j++)
         	         if(f.wildMan[j].isLeft())break;
         	      System.out.println(f.religious[i].getName()+"和"+f.wildMan[j].getName()+"坐船从左岸到右岸");
         	      f.leftRight(f.religious[i],f.wildMan[j]);
         	      f.lastLR=0;
         	      System.in.read(); 
         	      f.display();    
         	     } 
         	      break;
         	  case 1:
         	     {
         	      int i,j;
         	      for(i=0;i<f.religious.length;i++)
         	        if(f.religious[i].isLeft())break;
         	      for(j=i+1;j<f.religious.length;j++)
         	        if(f.religious[j].isLeft())break;
         	      System.out.println(f.religious[i].getName()+"和"+f.religious[j].getName()+"坐船从左岸到右岸");
         	      f.leftRight(f.religious[i],f.religious[j]);
         	      f.lastLR=1;
         	      System.in.read(); 
         	      f.display();    
         	     } 
         	      break; 
         	  case 2:
         	     {
         	      int i;
         	      for(i=0;i<f.religious.length;i++)
         	        if(f.religious[i].isLeft())break;
         	      System.out.println(f.religious[i].getName()+"坐船从左岸到右岸");
         	      f.leftRight(f.religious[i]);
         	      f.lastLR=2;
         	      System.in.read(); 
         	      f.display();    
         	     } 
         	      break;  
         	   case 3:
         	     {
         	      int i,j;
         	      for(i=0;i<f.wildMan.length;i++)
         	        if(f.wildMan[i].isLeft())break;
         	      for(j=i+1;j<f.wildMan.length;j++)
         	        if(f.wildMan[j].isLeft())break;
         	      System.out.println(f.wildMan[i].getName()+"和"+f.wildMan[j].getName()+"坐船从左岸到右岸");
         	      f.leftRight(f.wildMan[i],f.wildMan[j]);
         	      f.lastLR=3;
         	      System.in.read(); 
         	      f.display();    
         	     } 
         	      break;            
         	   case 4:
         	     {
         	      int i;
         	      for(i=0;i<f.wildMan.length;i++)
         	        if(f.wildMan[i].isLeft())break;
         	      System.out.println(f.wildMan[i].getName()+"坐船从左岸到右岸");
         	      f.leftRight(f.wildMan[i]);
         	      f.lastLR=4;
         	      System.in.read(); 
         	      f.display();    
         	     } 
         	      break;  
         	   case 5:
         	      return;   
         	 }
         System.in.read();	 
         if(f.leftMonk()==0&&f.leftWild()==0)return;	 
         switch(f.valueRightLeft()){
         	  case 0:
         	     {
         	      int i,j;
         	      for(i=0;i<f.religious.length;i++)
         	        if(f.religious[i].isRight())break;
         	      for(j=i+1;j<f.religious.length;j++)
         	        if(f.religious[j].isRight())break;
         	      System.out.println(f.religious[i].getName()+"和"+f.religious[j].getName()+"坐船从右岸回到左岸");
         	      f.rightLeft(f.religious[i],f.religious[j]);
         	      f.lastRL=0;
         	      System.in.read(); 
         	      f.display();    
         	     } 
         	     break;  
         	   case 1:
         	   case 2:
         	   case 3:
         	     {
         	      int i;
         	      for(i=0;i<f.religious.length;i++)
         	        if(f.religious[i].isRight())break;
         	      System.out.println(f.religious[i].getName()+"坐船从右岸回到左岸");
         	      f.rightLeft(f.religious[i]);
         	      f.lastRL=1;
         	      System.in.read(); 
         	      f.display();    
         	     } 
         	     break; 
         	   case 4:
         	     {
         	      int i,j;
         	      for(i=0;i<f.wildMan.length;i++)
         	        if(f.wildMan[i].isRight())break;
         	      for(j=i+1;j<f.wildMan.length;j++)
         	        if(f.wildMan[j].isRight())break;
         	      System.out.println(f.wildMan[i].getName()+"和"+f.wildMan[j].getName()+"坐船从右岸回到左岸");
         	      f.rightLeft(f.wildMan[i],f.wildMan[j]);
         	      f.lastRL=4;
         	      System.in.read(); 
         	      f.display();    
         	     } 
         	     break;      
         	   case 5:
         	   case 6:
         	   case 7:
         	     {
         	      int i;
         	      for(i=0;i<f.wildMan.length;i++)
         	        if(f.wildMan[i].isRight())break;
         	      System.out.println(f.wildMan[i].getName()+"坐船从右岸回到左岸");
         	      f.rightLeft(f.wildMan[i]);
         	      f.lastRL=5;
         	      System.in.read(); 
         	      f.display();    
         	     }
         	     break;
         	  case 8:
         	     {
         	      int i,j;
         	      for(i=0;i<f.religious.length;i++)
         	        if(f.religious[i].isRight())break;
         	      for(j=0;j<f.wildMan.length;j++)
         	        if(f.wildMan[j].isRight())break;
         	      System.out.println(f.religious[i].getName()+"和"+f.wildMan[j].getName()+"坐船从右岸回到左岸");
         	      f.rightLeft(f.religious[i],f.wildMan[j]);
         	      f.lastRL=8;
         	      System.in.read(); 
         	      f.display();    
         	     }      
         	 } 
          }	 
 	 	}
 	}	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -