42 点问题
42 点问题
题目描述:
众所周知在扑克牌中,有一个老掉牙的游戏叫做 24 点,选取4张牌进行加减乘除,看是否能得出 24 这个答案。
现在小蓝同学发明了一个新游戏,他从扑克牌中依次抽出6张牌,注意不是一次抽出,进行计算,看是否能够组成 42 点,满足输出 YES,反之输出 NO。
最先抽出来的牌作为第一个操作数,抽出牌做第二个操作数,运算结果在当作第一个操作数,继续进行操作。
除不尽的情况保留整数。
请设计一个程序对该问题进行解答。
样例:
输入:
K A Q 6 2 3
输出:
YES
- 思路分析:
扑克牌中的数1~K
,所以先判断字符,再枚举,最后再枚举运算符,利用集合存储结果。
- 解答:
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int[] a = new int[6]; //存储输入的数字
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
for (int i=0;i<6;i++){
String n;
n = scanner.next();
if (n.charAt(0) == 'A')
a[i] = 1;
else if (n.charAt(0) == 'J')
a[i] = 11;
else if (n.charAt(0) == 'Q')
a[i] = 12;
else if (n.charAt(0) == 'K')
a[i] = 13;
else
a[i] = (n.charAt(0) - '0'); //0的ASCII码为48,之后依次递增,减去之后即为本身
}
list.add(new ArrayList<>());
list.get(0).add(a[0]);
for (int i=1;i<=5;i++){
list.add(new ArrayList<>()); //存放1~5次的运算结果
for (int j=0;j<list.get(i-1).size();j++){ //i=0,j=1时,表示第一次运算(加减乘除)的结果
list.get(i).add(list.get(i-1).get(j) + a[i]);
list.get(i).add(list.get(i-1).get(j) - a[i]);
list.get(i).add(list.get(i-1).get(j) * a[i]);
list.get(i).add(list.get(i-1).get(j) / a[i]); //扑克中没有0,所以不用考虑除数为0的情况
}
}
int flag = 0;
for (int i=0;i<list.get(5).size();i++){
if (list.get(5).get(i) == 42){
flag = 1;
break;
}
}
if (flag == 1)
System.out.println("YES");
else
System.out.println("NO");
}
}