zoukankan      html  css  js  c++  java
  • 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到现在已经是最好的情况了。其实继续下去也许能解决这个问题,但实在太恶心,等一些高人拿出比较精辟的想法吧。

  • 相关阅读:
    LeetCode Single Number
    Leetcode Populating Next Right Pointers in Each Node
    LeetCode Permutations
    Leetcode Sum Root to Leaf Numbers
    LeetCode Candy
    LeetCode Sort List
    LeetCode Remove Duplicates from Sorted List II
    LeetCode Remove Duplicates from Sorted List
    spring MVC HandlerInterceptorAdapter
    yum
  • 原文地址:https://www.cnblogs.com/dsj2016/p/5205722.html
Copyright © 2011-2022 走看看