java中玩24点

任意四个数得到24点,可以将其表现为如下两种公式表示

( (a?b) ? c ) ? d       (  a?b ) ? ( c?d )

假设三个 ?号的符号已经确定,只要将所给的四个数字放入到两个公式中然后计算是否等于24;

到这一步关键就是怎么将四个数字放进去,可以用穷举法,将每一种情况列出来,也可以,通过算法,将四个数字按照一定规则排序然后得到特定序列,然后进行循环输入一个编号然后得到特定的序列,将这个特定序列的一串数字放入公式中。

代码如下

/*
	 * 参数一任意长度数组,参数二该数组长度n!-1之间的数设为count;
	 * 该数组有n!中排布方式,输入count可得到一个独一无二的排序方式的数组。
	 */
	public static void getNum(int b[],int count) {
		int n = b.length;
		int a [] = new int [n];
		for(int i = 0;i<n;i++) {
			a[i] = b[i];
		}
		int result[] = new int [n];
		
		
		result [n - 1] = count;
		for(int i = 1;i<n;i++) {
			if(result[n - i] <= n - i + 1) {
				result[n - i -1] = 1;
			}else {
				
				if( result[n - i] % (n - i + 1) == 0) {
//					System.out.println(n-i+1+"***整除" + result[n - i]);
					result [n -i -1] = result[n - i] / (n -i + 1);
				}
				else{
//					System.out.println(n-i+1+"***");
					result [n -i -1] = result[n - i] / (n -i +1) + 1;
				}
			}
		}
//		print(result);
		
		for(int i = 0;i<n;i++) {
			if( result[n - i -1] <= n - i)
				result[n - i -1] = result[n - i -1];
			else {
				result[n - i - 1] = result[n-i-1] - (result[n-i-2]-1) * (n-i);
			}
		}
//		print(result);
		int temp = 0;
		for(int i = 0;i<n ;i++) {
			if(result[i] == 1) {
//				System.out.println("nochange");
			}else {
				temp = a[result[i] - 2];
				a[result[i] - 2] = a[i];
				a[i] = temp;
//				System.out.print("change:");
//				print(a);
			}
		}
		
		print(a);
		return ;
		
	}

然后就是符号的排序,符号也可以给出一个长度为3的数组(因为没有考虑周全代码中的数组长度为4,但是并不影响输出),

每个符号都有4种可能,所以总共有4*4*4种可能性,可以建造一个类这个类中有两个方法,两个数据,第一个方法就是设置这两个数据值,另一个方法是,输入(0-3)之间的一个数然后就可以得到这个数字对应的运算结果,例如输入 0 就可以 两个数据相加的结果。

还是穷举法使用符号的排序,可以设置一个方法,输入一个编号就可以返回一个数组 例如 000 然后将这个数组放进建造的类中,那么就可以将这个000转化为+++,然后用这个+++和刚才所说的独一无二的数组进行运算 看看是否等于24。

整体思路就是这样,剩下的就是关于怎么排序得到独一无二的数组和得到符号,可以在我的代码中寻找。

package game;

import java.util.Scanner;

class Calculate
{

	double a,b;
	public void setValue(double a,double b)
	{
		this.a = a;
		this.b = b;
	}
	
	public double getValue(int i)
	{
//		System.out.println(i);
		switch(i)
		{
		case 0:return a+b;
		case 1:return a-b;
		case 2:return a*b;
		
		default:return a/b;
		}
	}
	
	
}

public class Game_24 {
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		double num[] = new double [4];
		for(int i = 0;i<4;i++)
		{
			System.out.println("输入第"+(i+1)+"个数据");
			num[i] = sc.nextDouble();
		}
		getResult(num);
		sc.close();
		
		
	}

	public static boolean getResult(double num[]) {
		boolean flag = false;
		double temp[] = new double [4];//数字排序
		int number[] = new int [4];//符号排序
		
		Calculate ca = new Calculate(); 
		double sum = 0;
		double sum2 = 0;
		for(int i = 1;i<= 24;i++)
		{
			temp = getNum(num,i);	
			for(int j = 1;j<=256;j++)
			{
				number = getNum1(j);
				//方案一
				sum = 0;
				for(int k = 0;k<4;k++)
				{
					ca.setValue(sum, temp[k]);
					sum = ca.getValue(number[k]);
				}
				
				if(sum >= 23.9&&sum<=24.1) {
					System.out.println("成功"+sum);
					print(temp);
					System.out.println("第一种((a?b)?c)?d");
					print1(number);
//					return true;
				}
				//方案二
				sum = 0;sum2 = 0;
				for(int k = 0;k<2;k++)
				{
					ca.setValue(sum, temp[k]);
					sum = ca.getValue(number[k]);
				}
				
				ca.setValue(temp[2], temp[3]);
				sum2 = ca.getValue(number[3]);
				ca.setValue(sum, sum2);
				sum = ca.getValue(number[2]);
				
				if(sum >= 23.9&&sum<=24.1) {
					System.out.println("成功"+sum);
					print(temp);
					System.out.println("第二种:(a?b)?(c?d):");
					print1(number);
//					return true;
				}
				
				//方案三
				sum = 0;
				for(int k = 0;k<4;k++)
				{
					ca.setValue(temp[k], sum);
					sum = ca.getValue(number[k]);
				}
				if(sum >= 23.9&&sum<=24.1) {
					System.out.println("成功"+sum);
					print2(number,temp);
//					return true;
				}
				//结束判断,进入下一轮判断
				
			}
		}
		return flag;
	}
	
	public static double[] getNum(double a[],int count)
	{
		int n = a.length;
		int result[] = new int [n];
		
		
		result [n - 1] = count;
		for(int i = 1;i<n;i++) {
			if(result[n - i] <= n - i + 1) {
				result[n - i -1] = 1;
			}else {
				
				if( result[n - i] % (n - i + 1) == 0) {
//					System.out.println(n-i+1+"***整除" + result[n - i]);
					result [n -i -1] = result[n - i] / (n -i + 1);
				}
				else{
//					System.out.println(n-i+1+"***");
					result [n -i -1] = result[n - i] / (n -i +1) + 1;
				}
			}
		}
//		print(result);
		
		for(int i = 0;i<n;i++) {
			if( result[n - i -1] <= n - i)
				result[n - i -1] = result[n - i -1];
			else {
				result[n - i - 1] = result[n-i-1] - (result[n-i-2]-1) * (n-i);
			}
		}
//		print(result);
		double temp = 0;
		for(int i = 0;i<n ;i++) {
			if(result[i] == 1) {
//				System.out.println("nochange");
			}else {
				temp = a[result[i] - 2];
				a[result[i] - 2] = a[i];
				a[i] = temp;
//				System.out.print("change:");
//				print(a);
			}
		}
		
		return a;
	}
	
	public static int [] getNum1(int count)
	{
		int result[]  = new int [4];
		int i = 0;
		while(i < 4) {
			result[i] = count % 4;
			count /= 4;
//			System.out.println(result[i]);
			i++;
			
		}
		result[0] = 0;
//		print(result);
		return result;
		
		
		
		
	}

	public static void print(double a[])
	{
		for(int i = 0;i<a.length;i++)
			System.out.print((int)a[i] + " ");
		System.out.println();
	}

	public static void print1(int a[])
	{
		String str = "+-*/";
		for(int i = 1;i<a.length;i++)
			System.out.print( str.charAt(a[i]) + " ");
		System.out.println();
		System.out.println();
	}

	public static void print2(int number[],double temp[]) {
		print(temp);
		String str = "+-*/";
		System.out.println(""+(int)temp[3]+str.charAt(number[3])+"("+(int)temp[2]+str.charAt(number[2])+"("+(int)temp[1]+str.charAt(number[1])+(int)temp[0]+"))" );
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值