首页>代码>java经典24点算法代码>/经典24点算法/c24point/src/com/wgtgt/A24Point.java
package com.wgtgt;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;

public class A24Point {
private static HashSet<String>set=new HashSet<String>();
	/**
	 * @Title: 24点计算器
	 * @Description: 24点计算器
	 * @author 冰水华川
	 * @date 2014-06-05 15:32
	 */
	public static void main(String[] args) {
//		int[]nums={5,5,5,1};
//		int[]nums={3,3,8,8};
//		int[]nums={3,4,4,9};
//		int[]nums={4,6,9,11};
//		int[]nums={2,2,7,9};
		int[]nums={4,5,7,8};
		
//		int[]nums={3,4,6,9};
//		int[]nums={3,4,5,10};
		total(nums);
		print(set);
	}
	public static void total(int[]nums) {
		Arrays.sort(nums);
		int count=equalsCount(nums);
		int a=nums[0];
		int b=nums[1];
		int c=nums[2];
		int d=nums[3];
		if(count==0){
			main(new int[]{a,b,c,d});
			main(new int[]{a,b,d,c});
			main(new int[]{a,c,b,d});
			main(new int[]{a,c,d,b});
			main(new int[]{a,d,b,c});
			main(new int[]{a,d,c,b});
			
			main(new int[]{b,c,d,a});			
			main(new int[]{b,c,a,d});			
			main(new int[]{b,d,a,c});			
			main(new int[]{b,d,c,a});			
			main(new int[]{b,a,c,d});			
			main(new int[]{b,a,d,c});
			
			main(new int[]{c,d,a,b});			
			main(new int[]{c,d,b,a});			
			main(new int[]{c,a,b,d});			
			main(new int[]{c,a,d,b});			
			main(new int[]{c,b,a,d});			
			main(new int[]{c,b,d,a});			
		}else if(count==1){
			int m=0;//相同
			int p=0;
			int q=0;
			if(a==b){
				m=a;
				p=c;
				q=d;
				main(new int[]{m,m,p,q});
				main(new int[]{m,m,q,p});
			}else if(b==c){
				m=b;
				p=a;
				q=d;
				main(new int[]{p,m,m,q});
				main(new int[]{q,m,m,p});
			}else if(c==d){
				m=c;
				p=a;
				q=b;
				main(new int[]{p,q,m,m});
				main(new int[]{q,p,m,m});
			}
		}else if(count==4){
			int m=a;
			int n=c;
			main(new int[]{m,m,n,n});
			main(new int[]{n,n,m,m});
			main(new int[]{m,n,m,n});
			main(new int[]{n,m,n,m});
		}else if(count==2){
			int m=0;//相同的
			int n=0;//单独的
			if(a==b){
				m=a;
				n=d;
			}else if(c==d){
				m=d;
				n=a;
			}
			main(new int[]{m,m,m,n});
			main(new int[]{m,m,n,m});
			main(new int[]{m,n,m,m});
			main(new int[]{n,m,m,m});
		}else if(count==3){
			main(new int[]{a,b,c,d});
		}
	}
	public static int equalsCount(int[]nums){
		int count=0;
		for (int i = 0; i < nums.length-1; i++) {
			if(nums[i]==nums[i+1]){
				count++;
			}
		}
		if(count==2){
			if(nums[0]==nums[1]){
				return 4;
			}else if(nums[1]==nums[2]){
				return 2;
			}
		}
		return count;
	}
	public static void main(int[]nums) {
		double a=nums[0];
		double b=nums[1];
		double c=nums[2];
		double d=nums[3];
		double sum=0;
		for (int i = 0; i < 6; i++) {
			for (int j = 0; j < 6; j++) {
				for (int k = 0; k < 6; k++) {
					sum=op(op(op(a,b,i),c,j),d,k);
					if(sum>23.999&&sum<24.001){
						set.add(format(i,j,k,a,b,c,d));
					}
				}
			}
		}
		
	}
	public static double op(double a,double b,int n){
		switch (n) {
		case 0:
			return a+b;
		case 1:
			return a-b;
		case 2:
			return b-a;
		case 3:
			return a*b;
		case 4:
			return a/b;
		case 5:
			return b/a;
		default:
			throw new RuntimeException("--yichang--");
		}
	}
		public static String format(int i,int j,int k,double a,double b,double c,double d){
			StringBuilder sb=new StringBuilder();
			sb.append(format(format(format(new StringBuilder(valueOf(a)),new StringBuilder(valueOf(b)),i),new StringBuilder(valueOf(c)),j),new StringBuilder(valueOf(d)),k));
			return sb.toString();
		}
		private static String valueOf(double b) {
			String result=String.valueOf(b);
			if(result.endsWith(".0")){
				return result.substring(0,result.length()-2);
			}
			return result;
		}
		private static StringBuilder format(StringBuilder a,StringBuilder b,int n){
			StringBuilder sb=new StringBuilder();
			switch (n) {
			case 0:
				sb.append('(');
				sb.append(a);
				sb.append('+');
				sb.append(b);
				sb.append(')');
				return sb;
			case 1:
				sb.append('(');
				sb.append(a);
				sb.append('-');
				sb.append(b);
				sb.append(')');
				return sb;
			case 2:
				sb.append('(');
				sb.append(b);
				sb.append('-');
				sb.append(a);
				sb.append(')');
				return sb;
			case 3:
				sb.append(a);
				sb.append('*');
				sb.append(b);
				return sb;
			case 4:
				sb.append('(');
				sb.append(a);
				sb.append('/');
				sb.append(b);
				sb.append(')');
				return sb;
			case 5:
				sb.append('(');
				sb.append(b);
				sb.append('/');
				sb.append(a);
				sb.append(')');
				return sb;
			default:
				throw new RuntimeException("--yichang--");
			}
		}
		private static void print(HashSet<String>set){
			if(set.size()==0){
				System.out.println("无解");
				return;
			}
			Iterator<String>ite=set.iterator();
			while(ite.hasNext()){
				String str=ite.next();
				System.out.println(str);
			}
		}
}

最近下载更多
怪浪鱼  LV2 2021年12月8日
liangby123  LV1 2021年7月26日
1307027430  LV1 2021年7月16日
2196316269  LV10 2021年2月25日
华灯初上旧人安  LV8 2021年1月11日
ecodemo  LV2 2021年1月9日
name11  LV1 2020年6月21日
zmzdmw  LV1 2020年6月19日
zhinian2  LV1 2020年6月17日
1305700518  LV1 2020年6月10日
最近浏览更多
EFWAGGFAWGR 2023年10月19日
暂无贡献等级
lironggang  LV38 2023年3月26日
crosa_Don  LV18 2022年7月19日
floweyws  LV6 2022年6月3日
liangge2115  LV27 2022年3月11日
怪浪鱼  LV2 2021年12月8日
gonnass  LV1 2021年10月22日
liangby123  LV1 2021年7月26日
1307027430  LV1 2021年7月16日
1111545454654  LV3 2021年7月4日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友