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;
	    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章