自己写的一个24点

闲暇之余写了一个24点,请各位大虾指正!

缺点之一:有重复结果出现
临时解决:使用set防止重复

缺点之二:代码不够精简

缺点之三:算法仍需优化

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * 24点
 * 
 * @author zhiguo.zhao
 * 
 */
public class Main {

	static int N = 24;
	static Set<String> rs = new HashSet<String>();
	static int num = 0;

	public static void main(String[] args) {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line;
		try {
			while ((line = br.readLine()) != null) {
				try {
					if ("exit".equals(line))
						break;

					String[] s = line.split("\\s");
					int[] v = new int[4];
					for (int idx = 0; idx < 4; idx++) {
						v[idx] = Integer.parseInt(s[idx]);
						if (v[idx] <= 0 || v[idx] >= 10)
							throw new Exception("Input error.");
					}
					rs.clear();
					num = 0;
					comb(new Comb(v[0]), new Comb(v[1]), new Comb(v[2]), new Comb(v[3]));

					for (Iterator it = rs.iterator(); it.hasNext();) {
						System.out.println(it.next());
					}
					System.out.println("total exec times:" + num);
				} catch (Exception ex) {
					ex.printStackTrace();
				}
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	private static void comb(Comb... v) {
		for (int i = 0; i < v.length - 1; i++) {
			for (int j = i + 1; j < v.length; j++) {
				subcomb(i, j, new Comb(v[i], v[j], '+'), v);
				subcomb(i, j, new Comb(v[i], v[j], '-'), v);
				subcomb(i, j, new Comb(v[j], v[i], '-'), v);
				subcomb(i, j, new Comb(v[i], v[j], '*'), v);
				subcomb(i, j, new Comb(v[i], v[j], '/'), v);
				subcomb(i, j, new Comb(v[j], v[i], '/'), v);
			}
		}
	}

	private static void subcomb(int i, int j, Comb c, Comb... v) {
		int n = 0, p1 = 0, p2 = 0;
		for (int k = 0; k < v.length; k++) {
			if (k != i && k != j) {
				n++;
				if (n == 1) {
					p1 = k;
				} else if (n == 2) {
					p2 = k;
				}
			}
		}
		if (n == 1) {
			comb(c, v[p1]);
		} else if (n == 2) {
			comb(c, v[p1], v[p2]);
		}

		if (v.length == 2) {
			try {
				if (c.val() == N) {
					rs.add(c.expression());
				}
			} catch (Exception e) {
			}

		}
		num++;
	}
}

class Comb {

	private int n;// 分子
	private int m;// 分母
	private String el;// 表壳式
	private char op;//操作符

	Comb(int i) {
		n = i;
		m = 1;
	}

	Comb(int n, int m) {
		this.n = n;
		this.m = m;
	}

	Comb(Comb a, Comb b, char op) {
		this.op = op;
		switch (op) {
		case '+':
			n = a.add(b).n;
			m = a.add(b).m;
			el = "(" + a.expression() + op + b.expression() + ")";
			;
			break;
		case '-':
			n = a.min(b).n;
			m = a.min(b).m;
			el = "(" + a.expression() + op + b + ")";
			;
			break;
		case '*':
			n = a.mul(b).n;
			m = a.mul(b).m;
			el = "" + a + op + b;
			break;
		case '/':
			n = a.div(b).n;
			m = a.div(b).m;
			el = "(" + a.expression() + op + b + ")";
			;
			break;

		default:
			break;
		}


		//el = "(" + a + op + b + ")";
	}

	Comb add(Comb b) {// 加
		return new Comb(n * b.m + b.n * m, m * b.m);
	}

	Comb min(Comb b) {// 减
		return new Comb(n * b.m - b.n * m, m * b.m);
	}

	Comb mul(Comb b) {// 乘
		return new Comb(n * b.n, m * b.m);
	}

	Comb div(Comb b) {// 除
		return new Comb(n * b.m, m * b.n);
	}

	int val() {// 值
		if (n % m == 0)
			return n / m;
		else
			throw new RuntimeException();
	}

	public String expression() {
		if (el == null)
			return "" + n;
		if (el.startsWith("(") && el.endsWith(")")) {// 最终结果也不用加括号
			return el.substring(1, el.length() - 1);
		} else {
			return toString();
		}
	}

	@Override
	public String toString() {
		return el == null ? "" + n : el;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值