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

原文地址:https://www.cnblogs.com/dsj2016/p/5205722.html