作業說明:
題目:從撲克中每次取出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;
}
}