24点游戏,穷举法

作业说明:
题目:从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求编程解决24点游戏。
基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。

思路:首先将4个扑克牌代表的数字存储起来,然后挑选出两个数字进行”±*%”运算,将得到的数存储起来与第三个数运算,重复以上过程,直到只剩一个数,判断得到的结果是否为24,是的话输出表达式。

先对随机产生的两个数进行运算,这两个数计算的结果和第三个数组成两数计算,
以此类推,直到四个数经过运算组合成一个数(即n = 1)时,判断这个数是否等于24
若等于24,输出这四个数的运算,否则返回false。
当递归到只有一个数时,判断是否满足等于24的条件。
输出可以构成24的表达式。
在方法中,定义两个变量两个表达式,来进行运算,将运算结果存储到第一个变量和表达式。

加法乘法不分顺序,减法需要考虑,num1-num2/num2-num1。除法:(1)num1/num2.(2)num2/num1。 并且分母不能为零。

package homework1;

import java.util.Scanner;

public class Game24 {

	    private static int NUM = 4; //抽取的扑克牌数量
	    private static double[] number = new double[NUM]; //定义扑克牌的数组
	    private static String[] express = new String[NUM]; //定义表达式数组
	    
	    public static void main(String[] args) {
	    	
	        Scanner scanner = new Scanner(System.in);  //从键盘输入
	        System.out.println("请输入1-13之间的4个正整数");
	        for (int i = 0; i < NUM; i++) {          //连续输入1-13之间的4个数
	            number[i] = scanner.nextInt();
	            int x = (int)number[i];
	            express[i] = String.valueOf(x);
	        }
	        if(compute(NUM))
	            System.out.println("可以组成24!");
	        else
	            System.out.println("不能组成24!");
	    }
	    
	    
	    /**
	     * 先对随机产生的两个数进行运算,这两个数计算的结果和第三个数组成两数计算,
	     * 以此类推,直到四个数经过运算组合成一个数(即n = 1)时,判断这个数是否等于24
	     * 若等于24,输出这四个数的运算,否则返回false
	     * @param n
	     * @return
	     */
	    public static boolean compute(int n){
	    	
	        //当递归到只有一个数时,判断是否满足等于24的条件
	        if(n == 1){
	            if(number[0] == 24){
	            	/*
	            	 * 输出可以构成24的表达式
	            	 * substring(x)   是从字符串的的第x个字符截取
	            	 * substring(x,y)是从x到y前的位置停止
	            	 */
	                System.out.println(express[0]);
	                return true;
	            }
	            else
	                return false;
	        }
	        
	        
	        for (int i = 0; i < n - 1; i++) {
	            for(int j = i + 1; j < n; j++){
	            	
	            	//首先对两个数进行运算,定义两个变量,和两个表达式
	                double num1 = number[i];
	                double num2 = number[j];
	                //两个表达式
	                String express1 = express[i];
	                String express2 = express[j];
	                number[j] = number[n-1];
	                express[j] = express[n-1];
	                
	                //做加法运算
	                express[i] = "("+express1+"+"+express2+")";
	                number[i] = num1+num2;
	                if(compute(n-1))
	                    return true;
	                
	                /*减法运算:
	                 * (1)num1-num2
	                 * (2)num2-num1
	                 */
	                express[i] = "("+express1+"-"+express2+")";
	                number[i] = num1-num2;
	                if(compute(n-1))
	                    return true;
	                express[i] = "("+express2+"-"+express1+")";
	                number[i] = num2-num1;
	                if(compute(n-1))
	                    return true;
	                
	                //乘法运算
	                express[i] = "("+express1+"*"+express2+")";
	                number[i] = num1*num2;
	                if(compute(n-1))
	                    return true;
	                
	                /*除法运算两种情况(分母不为0)
	                 * (1)num1/num2
	                 * (2)num2/num1
	                 */
	                //第一种
	                if(num2 != 0){//分母不为0
	                	express[i] = "("+express1+"/"+express2+")";
	                    number[i] = num1/num2;
	                    if(compute(n-1))
	                        return true;
	                }
	                //第二种
	                if(num1 != 0){//分母不为0
	                	express[i] = "("+express2+"/"+express1+")";
	                    number[i] = num2/num1;
	                    if(compute(n-1))
	                        return true;
	                }
	                number[i] = num1;
	                number[j] = num2;
	                express[i] = express1;
	                express[j] = express2;
	            }
	        }
	        return false;
	    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章