24点游戏问题(java)

24点游戏问题(java)


随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式。

import java.util.Random;
/**
* @ClassName: _24game
* @Description: 解法:假设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个。
* @author Administrator
* @date 2018年9月29日
*/
public class _24game{ 
		static int num=0;//计算总共有多少种情况
		public static void main(String[] args) {
			/*
			 * 定义一个数组,用来存放4张牌(4个从1到13的随机数)
			 * 并将它们存入数组poker
			 */
			int [] cards = new int  [4];
			Random random = new Random();
			cards[0] = random.nextInt(13)+1;
			cards[1] = random.nextInt(13)+1;
			cards[2] = random.nextInt(13)+1;
			cards[3] = random.nextInt(13)+1;
			System.out.println(cards[0]+"\n"+cards[1]+"\n"+cards[2]+"\n"+cards[2]);
			int[] poker=new int[]{cards[0],cards[1],cards[2],cards[3]};
			opertor(poker);
			if(num==0){
				System.out.println("以上四个数不能通过四则运算得到24");
			}else{
			System.out.println("总共有"+num+"种情况");
			}
		}
		/*
		 * 使用3层for循环来获取运算符的所有组合存入signNum数组
		 * 调用sign1方法获得与数字对应的运算符输出
		 */
		public static void opertor(int[] poker){
			double sum=0;
			for(int i=0;i<4;i++){
				double sum1=count(poker[0],poker[1],i);
				for(int j=0;j<4;j++){
					double sum2=count(sum1,poker[2],j);
					for(int k=0;k<4;k++){
						sum=count(sum2,poker[3],k);
						int[] signNum={i,j,k};
						String[] sign1=new String[4];
						sign1=sign(signNum);
						if(sum==24){
							num++;
							System.out.println("["+"("+poker[0]+" "+sign1[0]+" "+poker[1]+")"+" "+sign1[1]+" "+poker[2]+"]"+" "+sign1[2]+" "+poker[3]);
						}
					}
				}
			}
		}
		/*
		 * 通过符号来计算两个数并返回
		 */
		public static double count(double num1,double num2,int num){
			double sum=0.0;
			if(num==0){
				sum=num1+num2;
			}else if(num==1){
				sum=num1-num2;
			}else if(num==2){
				sum=num1*num2;
			}else{
				sum=num1/num2;
			}
			return sum;//返回运算后的值
		}
		/*
		 * 将代表计算符号的数字转换成字符存入String数组并返回
		 */
		public static String[] sign(int[] signNum){
			String[] sign1=new String[4];
			for(int i=0;i<3;i++){
				int sign2=signNum[i];
				switch (sign2) {
				case 0:
					sign1[i]="+";
					break;
				case 1:
					sign1[i]="-";
					break;
				case 2:
					sign1[i]="x";
					break;
				case 3:
					sign1[i]="÷";
					break;
				default:
					break;
				}
			}
			return sign1;//返回运算符
		}
	}


猜你喜欢

转载自blog.csdn.net/weixin_42594136/article/details/82910055
今日推荐