程序员笔试笔试-典型编程题——24点游戏(java)

题目详情

“24点游戏是一种使用扑克牌来进行的益智类游戏,游戏内容是:从一副扑克牌中抽去大小王剩下52张,任意抽取4张牌,把牌面上的数(A代表1)运用加、减、乘、除和括号进行运算得出24。每张牌都必须使用一次,但不能重复使用。

有些组合有不同种算法,例如要用2,4,6,12四张牌组合成24点,可以有如下几种组合方法:

  1. 2 + 4 + 6 + 12 = 24 
  2. 4 × 6 ÷ 2 + 12 = 24 
  3. 12 ÷ 4 × (6 + 2) = 24

当然,也有些组合算不出24,如1、1、1、1 和 6、7、8、8等组合。”

–题目描述来自wikipedia:http://zh.wikipedia.org/wiki/24%E7%82%B9

请完成函数can24,4张牌如果可以组成24点,返回1,不能则返回0。

友情提醒

注意以下这些组合:

1 1 1 10    不可以;

6 6 6 6     可以;

5 5 5 1     可以,即可以用分数,如(5-1/5)*5 = 24;

1 1 1 11   可以;

如果你还是不咋明白24点到底是怎么一回事,这里有一个可以在线计算24点的应用:http://www.zhongguosou.com/game_lookup_tools/game_24_point.html,可慢慢体会。

/**
 * 解法:假设4 个数的集合A={1,2,3,4},
 * 先取前两个数进行不同的四则运算,1+2=3,1-2=-1,2-1=1,1/2=0.5,2/1=2,1x2=2,
 * 将所得的结果递归的与集合A中剩下的进行四则运算,
 * 问题规模从4个变成3个。。。最后变成2个。
 * */
public class _24Game {

	double wucha = 1E-6; // 浮点除法有精度损失
	double num[] = new double[4];
	boolean flag; // 标记是否成功
	public static void main(String[] args) {
		_24Game game=new _24Game();
		System.out.println(game.can24(6, 6, 6, 6));
		System.out.println(game.can24(2, 4, 10, 10));	
		System.out.println(game.can24(5, 5, 5, 1));
		System.out.println(game.can24(1, 1, 1, 10)); // 不可以
		System.out.println(game.can24(1, 1, 1, 11));		
	}	
	/*
	 * n,每次计算以后减1
	 * num[i]为第一个,时刻更新num[i]的值
	 * num[j]第一次计算以后,都是从最后一个值移动而来
	 * */
	void game24(int n) {
		if (n == 1) {
			if (Math.abs(num[0] - 24) <= wucha) {
				flag = true;
				return;
			}
		}
		if (flag)
			return; 
		for (int i = 0; i < n; i++) {
			for (int j = i + 1; j < n; j++) {
				double a, b;
				a = num[i];
				b = num[j];
				num[j] = num[n - 1]; 
				num[i] = a + b;
				game24(n - 1);
				num[i] = a - b;
				game24(n - 1);
				num[i] = b - a;
				game24(n - 1);
				num[i] = a * b;
				game24(n - 1);
				if (b != 0) {
					num[i] = a / b;
					game24(n - 1);
				}
				if (a != 0) {
					num[i] = b / a;
					game24(n - 1);
				}
				num[i] = a;
				num[j] = b;				
			}
		}
	}

	int can24(int a, int b, int c, int d) {
		num[0] = (double) (a);
		num[1] = (double) (b);
		num[2] = (double) (c);
		num[3] = (double) (d);
		flag = false;
		game24(4);
		if (flag)
			return 1;
		else
			return 0;
	}
}

转载请注明本文出处:http://blog.csdn.net/love254443233

    原文作者:游程编码问题
    原文地址: https://blog.csdn.net/love254443233/article/details/9032575
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞