题目
Description
速算24点相信绝大多数人都玩过。就是随机给你四张牌,包括 A(1),2,3,4,5,6,7,8,9,10,J(11),Q(12),K(13)。要求只用’+’,’-‘,’*’,’/’运算符以及括号改变运算 顺序,使得最终运算结果为24(每个数必须且仅能用一次)。游戏很简单,但遇到无解的情况往往让人很郁闷。你的任务就是针对每一组随机产生的四张牌,判断 是否有解。我们另外规定,整个计算过程中都不能出现小数。
Input
输入数据占一行,给定四张牌。
Output
如果有解则输出”Y”,无解则输出”N”。
Sample Input
A 2 3 6
Sample Output
Y
代码块
import java.util.Scanner;
public class Main {
static int[] a = new int[6];
public static void main(String[] args) {
Scanner cn = new Scanner(System.in);
String[] s = new String[6];//因为Scanner类中没有输入char的方法
for (int i = 0; i < 4; i++)
s[i] = cn.next();
for (int i = 0; i < 4; i++) {//对输入的值进行判断,并返回到,int数组里面
if (s[i] == "A")
a[i] = 1;
else if (s[i] == "J")
a[i] = 11;
else if (s[i] == "Q")
a[i] = 12;
else if (s[i] == "K")
a[i] = 13;
else{
char c = s[i].charAt(0);
a[i] = c-'0';
}
}
if(pointTF(0))//进行输入的点数判断
System.out.println("Y");
else
System.out.println("N");
}
public static boolean pointTF(int x) {
if (x == 3) {//因为,每张牌,只能使用一次,所以总共四次,第四次的时候,判断,对应的数组中是否为,并返回对应的布尔值
if (24 == a[x])
return true;
return false;
}
for (int i = x; i < 4; i++) {//进行第几张牌的循环
for (int j = i + 1; j < 4; j++) {//进行这一张牌,与下面几张牌的计算处理
int le = a[i], ri = a[j];//因为下面有递归,会将x=0这个操作给跳过,所以在循环中先对每一层循环的开头,进行赋值
a[i] = a[x];
a[j] = le + ri;//在进行下列的处理
if (pointTF(x + 1))
return true;
a[j] = le - ri;
if (pointTF(x + 1))
return true;
a[j] = le*ri;
if(pointTF(x+1))
return true;
a[j] = ri-le;
if(pointTF(x+1))
return true;
if(ri!=0&&le%ri==0){
a[j] = le/ri;
if(pointTF(x+1))
return true;
}
if(le!=0&&ri%le==0){
a[j]=ri/le;
if(pointTF(x+1))
return true;
}
a[i] = le;
a[j] = ri;
}
}
return false;
}
}