有个群友去一家公司面试,笔试题有中这样一题:无限量的水, 3L的水桶和5L的水桶各一个。 求怎么得出4升水。 要写程序, 别写步骤。 中文谁都会写。(考官这样说的)

这样的题目初看起来非常简单,但如何用编程的方式去实现,就需要一定的建模基础了。

下面贴出代码:

public class GetWater
{
	public static void main(String args[])
	{
		Case c = new Case();
		c.setFiveCase(get5Water(false));// 往5升容器中放满水
		set3Water(c);// 5升容器往3升容器倒水
		c.setThreeCase(get3Water(true));// 清空3升容器
		set3Water(c);// 5升容器往3升容器倒水
		c.setFiveCase(get5Water(false));// 往5升容器中放满水
		set3Water(c);// 5升容器往3升容器倒水
		System.out.println("Three:" + c.getThreeCase());
		System.out.println("Five:" + c.getFiveCase());// 最后5升容器还有4升水
	}
	/**
	 * 5容器往3容器放水
	 *
	 * @param water
	 * @return
	 */
	public static void set3Water(Case c)
	{
		int water = c.getFiveCase() > Case.THREE ? (Case.THREE - c.getThreeCase() > 0 ? Case.THREE - c.getThreeCase() : 0) : c.getFiveCase();
		c.setThreeCase(water);
		c.setFiveCase(c.getFiveCase() - water);
	}
	/**
	 * 得到/清除5升水
	 *
	 * @isDelete true is clear Case Water,false is Full Water
	 * @return
	 */
	public static int get5Water(boolean isDelete)
	{
		return isDelete ? 0 : 5;
	}
	/**
	 * 得到/清除3升水
	 *
	 * @isDelete true is clear Case Water,false is Full Water
	 * @return
	 */
	public static int get3Water(boolean isDelete)
	{
		return isDelete ? 0 : 3;
	}
}

class Case
{
	/**
	 * 5升水容器的最大容量
	 */
	public static final int FIVE = 5;
	/**
	 * 3升水容器的最大容量
	 */
	public static final int THREE = 3;
	/**
	 * 5升容器
	 */
	private int fiveCase;
	/**
	 * 3升容器
	 */
	private int threeCase;

	public int getFiveCase()
	{
		return fiveCase;
	}
	public void setFiveCase(int fiveCase)
	{
		this.fiveCase = fiveCase;
	}
	public int getThreeCase()
	{
		return threeCase;
	}
	public void setThreeCase(int threeCase)
	{
		this.threeCase = threeCase;
	}
}