• lift and throw


    import java.util.*;
    import java.math.*;
    
    public class Main {
    	public static void main(String[] args) {
    		
    		Scanner sc = new Scanner(System.in);
    		int aPos = sc.nextInt();
    		int aMov = sc.nextInt();
    		int aThr = sc.nextInt();
    		int bPos = sc.nextInt();
    		int bMov = sc.nextInt();
    		int bThr = sc.nextInt();
    		int cPos = sc.nextInt();
    		int cMov = sc.nextInt();
    		int cThr = sc.nextInt();
    		sc.close();
    		
    		Solution s = new Solution();
    		s.start(aPos, aMov, aThr, bPos, bMov, bThr, cPos, cMov, cThr);
    	}
    }
    
    class Solution {
    	private int maxLength = 0;
    	
    	private int aMov;
    	private int aThr;
    	private int bMov;
    	private int bThr;
    	private int cMov;
    	private int cThr;
    	
    	public void start(int aPos, int aMov, int aThr,
    			int bPos, int bMov, int bThr,
    			int cPos, int cMov, int cThr) {
    		this.aMov = aMov;
    		this.aThr = aThr;
    		this.bMov = bMov;
    		this.bThr = bThr;
    		this.cMov = cMov;
    		this.cThr = cThr;
    		recursion(aPos, bPos, cPos, 511, 0, 0, 0);
    		System.out.println(this.maxLength);
    	}
    	
    	public void recursion(int curLengthA, int curLengthB, int curLengthC, int movStates, int aPos, int bPos, int cPos) {
    		int curMax = max_3(curLengthA, curLengthB, curLengthC);
    		if(maxLength < curMax)
    			maxLength = curMax;
    
    		if(movStates == 0 || curLengthA < 0 || curLengthB < 0 || curLengthC < 0)
    			return ;
    		
    		//Walk
    		if( ((movStates & 448) == 256 || (movStates & 448) == 448 ) && aPos == 0) {
    			for(int i = 1; i <= this.aMov; i++) {
    				if(curLengthA + i != curLengthB && curLengthA + i != curLengthC)
    					recursion(curLengthA + i, curLengthB, curLengthC, movStates & 255, aPos, bPos, cPos);
    				if(curLengthA - i != curLengthB && curLengthA - i != curLengthC)
    					recursion(curLengthA - i, curLengthB, curLengthC, movStates & 255, aPos, bPos, cPos);
    			}
    		}
    		if( ((movStates & 56) == 32 || (movStates & 56) == 56 ) && bPos == 0) {  
    			for(int i = 1; i <= this.bMov; i++) {
    				if(curLengthB + i != curLengthA && curLengthB + i != curLengthC)
    					recursion(curLengthA, curLengthB + i, curLengthC, movStates & 479, aPos, bPos, cPos);
    				if(curLengthB - i != curLengthA && curLengthB - i != curLengthC)
    					recursion(curLengthA, curLengthB - i, curLengthC, movStates & 479, aPos, bPos, cPos);
    			}
    		}
    		if( ((movStates & 7) == 4 || (movStates & 7) == 7 ) && cPos == 0) {
    			for(int i = 1; i <= this.cMov; i++) {
    				if(curLengthC + i != curLengthB && curLengthC + i != curLengthA)
    					recursion(curLengthA, curLengthB, curLengthC + i, movStates & 507, aPos, bPos, cPos);
    				if(curLengthC - i != curLengthB && curLengthC - i != curLengthA)
    					recursion(curLengthA, curLengthB, curLengthC - i, movStates & 507, aPos, bPos, cPos);
    			}
    		}
    		
    		// lift
    		if(Math.abs(curLengthA - curLengthB) == 1 && (movStates & 128) == 128 && aPos == 0 && bPos == 0)  	// a lift b
    			recursion(curLengthA, curLengthA, curLengthC == curLengthB ? curLengthA : curLengthC, movStates & 383, 0, 1, cPos == 1 ? 2 : 0);
    		if(Math.abs(curLengthA - curLengthB) == 1 && (movStates & 16) == 16 && aPos == 0 && bPos == 0)  	// b lift a
    			recursion(curLengthB, curLengthB, curLengthC == curLengthA ? curLengthB : curLengthC, movStates & 495, 1, 0, cPos == 1 ? 2 : 0);
    		if(Math.abs(curLengthA - curLengthC) == 1 && (movStates & 128) == 128 && aPos == 0 && cPos == 0)  	// a lift c
    			recursion(curLengthA, curLengthB == curLengthC ? curLengthA : curLengthB, curLengthA, movStates & 383, 0, bPos == 1 ? 2 : 0, 1);
    		if(Math.abs(curLengthA - curLengthC) == 1 && (movStates & 2) == 2 && aPos == 0 && cPos == 0)  		// c lift a
    			recursion(curLengthC, curLengthB == curLengthA ? curLengthC : curLengthB, curLengthC, movStates & 509, 1, bPos == 1 ? 2 : 0, 0);
    		if(Math.abs(curLengthB - curLengthC) == 1 && (movStates & 16) == 16 && bPos == 0 && cPos == 0)  	// b lift c
    			recursion(curLengthA == curLengthC ? curLengthB : curLengthA, curLengthB, curLengthB, movStates & 495, aPos == 1 ? 2 : 0, 0, 1);	
    		if(Math.abs(curLengthB - curLengthC) == 1 && (movStates & 2) == 2 && bPos == 0 && cPos == 0) 		// c lift b
    			recursion(curLengthA == curLengthB ? curLengthC : curLengthA, curLengthC, curLengthC, movStates & 509, aPos == 1 ? 2 : 0, 1, 0);
    		
    		//throw	
    		if(aPos + bPos + cPos == 1) {
    				
    			int lifting = 0;
    			if((movStates & 24) == 8)
    				lifting = 1;
    			if((movStates & 3) == 1)
    				lifting = 2;
    			
    			int throwed = 0;
    			if(bPos == 1)
    				throwed = 1;
    			if(cPos == 1)
    				throwed = 2;
    			
    			
    			if(lifting == 0 && throwed == 1) { //a throw b
    				for(int i = 1; i <= this.aThr; i++) {
    					if(i + curLengthB != curLengthC)
    						recursion(curLengthA, curLengthB + i, curLengthC, movStates & 447, 0, 0, 0);
    					if(i - curLengthB != curLengthC)
    						recursion(curLengthA, curLengthB - i, curLengthC, movStates & 447, 0, 0, 0);
    				}
    			}
    			if(lifting == 0 && throwed == 2) { //a throw c
    				for(int i = 1; i <= this.aThr; i++) {
    					if(i + curLengthC != curLengthB)
    						recursion(curLengthA, curLengthB, curLengthC + i, movStates & 447, 0, 0, 0);
    					if(i - curLengthC != curLengthB)
    						recursion(curLengthA, curLengthB, curLengthC - i, movStates & 447, 0, 0, 0);
    				}		
    			}
    			if(lifting == 1 && throwed == 0) { //b throw a
    				for(int i = 1; i <= this.bThr; i++) {
    					if(i + curLengthA != curLengthC)
    						recursion(curLengthA + i, curLengthB, curLengthC, movStates & 503, 0, 0, 0);
    					if(i - curLengthA != curLengthC)
    						recursion(curLengthA - i, curLengthB, curLengthC, movStates & 503, 0, 0, 0);
    				}
    			}
    			if(lifting == 1 && throwed == 2) { //b throw c
    				for(int i = 1; i <= this.bThr; i++) {
    					if(i + curLengthC != curLengthA)
    						recursion(curLengthA, curLengthB, curLengthC + i, movStates & 503, 0, 0, 0);
    					if(i - curLengthC != curLengthA)
    						recursion(curLengthA, curLengthB, curLengthC - i, movStates & 503, 0, 0, 0);	
    				}
    			}
    			if(lifting == 2 && throwed == 0) { //c throw a
    				for(int i = 1; i <= this.cThr; i++) {
    					if(i + curLengthA != curLengthB)
    						recursion(curLengthA + i, curLengthB, curLengthC, movStates & 510, 0, 0, 0);
    					if(i - curLengthA != curLengthB)
    						recursion(curLengthA - i, curLengthB, curLengthC, movStates & 510, 0, 0, 0);
    				}
    			}
    			if(lifting == 2 && throwed == 1) { //c throw b
    				for(int i = 1; i <= this.cThr; i++) {
    					if(i + curLengthB != curLengthA)
    						recursion(curLengthA, curLengthB + i, curLengthC, movStates & 510, 0, 0, 0);
    					if(i - curLengthB != curLengthA)
    						recursion(curLengthA, curLengthB - i, curLengthC, movStates & 510, 0, 0, 0);
    				}
    			}
    		}	
    		else if(aPos + bPos + cPos == 3) {
    			
    			int throwing = 0;
    			if(bPos == 0)
    				throwing = 1;
    			if(cPos == 0)
    				throwing = 2;
    			
    			if(throwing == 0) {
    				for(int i = 1; i <= this.aThr; i++) {
    					recursion(curLengthA, curLengthB + i, curLengthC + i, movStates & 447, 0, bPos - 1, cPos - 1);
    					recursion(curLengthA, curLengthB - i, curLengthC - i, movStates & 447, 0, bPos - 1, cPos - 1);
    				}
    			}
    			if(throwing == 1) {
    				for(int i = 1; i <= this.bThr; i++) {
    					recursion(curLengthA + i, curLengthB, curLengthC + i, movStates & 503, aPos - 1, 0, cPos - 1);
    					recursion(curLengthA - i, curLengthB, curLengthC - i, movStates & 503, aPos - 1, 0, cPos - 1);
    				}
    			}
    			if(throwing == 2) {
    				for(int i = 1; i <= this.cThr; i++) {
    					recursion(curLengthA + i, curLengthB + i, curLengthC, movStates & 510, aPos - 1, bPos - 1, 0);
    					recursion(curLengthA - i, curLengthB - i, curLengthC, movStates & 510, aPos - 1, bPos - 1, 0);
    				}
    			}
    		}
    	}	
    	private int max_3(int a, int b, int c) {
    		if(a >= b && a >= c)
    			return a;
    		else if(b >= a && b >= c)
    			return b;
    		else
    			return c;
    	}
    	
    }
    

     这道题目是蓝桥杯官网练习系统的一道题目,我目前没有找到什么巧解来解决这道题目,大致上只是用暴力列举每一种情况。

    当然这样做的坏处就是要面对极多的逻辑控制。我这代码最终也没有拿全分数,有3组测试数据跑出了时间限制。而且由于逻辑的控制过于复杂(对我来说),在不知道测试数据的情况下慢慢自己debug到现在已经是最好的情况了。其实继续下去也许能解决这个问题,但实在太恶心,等一些高人拿出比较精辟的想法吧。

  • 相关阅读:
    AODV点点滴滴
    让控件的DropdownMenu或者PopupMenu弹出来
    如何让CoolBar控件的Bands在同一行上
    怎样在InstallShield的Basic MSI Project中用InstallScript添加路径
    VC调用Delphi制作的动态链接库如何互相传递字符串
    Delphi 中用 GetEnvironmentVariable 获取常用系统变量
    如何在工具栏或者其他的控件上显示其他控件的Hint
    企业信息开发平台(1)序
    对.Net 垃圾回收的C#编程相关方面(Finalize 和Dispose(bool disposing)和 Dispose())的一些理解体会(转)
    android上怎样让一个Service开机自动启动
  • 原文地址:https://www.cnblogs.com/dsj2016/p/5205722.html
Copyright © 2020-2023  润新知