您的位置:首页 > 其它

华为 2033 24点游戏算法

2015-04-24 00:48 363 查看
24点游戏算法 答题时间: 00 小时
00 分 05 秒
描述: 问题描述:给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利

输入:

4个1-10的数字。[数字允许重复,测试用例保证无异常数字]

输出:

true or false

知识点:循环
题目来源:内部整理
练习阶段:初级
运行时间限制:10Sec
内存限制:128MByte
输入:输入4个int整数

输出:返回能否得到24点,能输出true,不能输出false

样例输入:
7 2 1 10

样例输出:
true

答案提示:
package HW基础题;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
import java.util.Stack;

public class HW2033 {

static String operator[] = { "+","-","*","/" };
static String num[] =new String[8];//= { ' ', '1', ' ', '2', ' ', '3', ' ', '4', ' ', '5',
//' ', '6', ' ', '7', ' ', '8', ' ', '9' };
static int X = 0;
static int count = 0;

/**
* 将字符串转化成List
* @param str
* @return
*/
public static ArrayList<String> getStringList(String str){
ArrayList<String> result = new ArrayList<String>();
String num = "";
for (int i = 0; i < str.length(); i++) {
if(Character.isDigit(str.charAt(i))){
num = num + str.charAt(i);
}else{
if(num != ""){
result.add(num);
}
result.add(str.charAt(i) + "");
num = "";
}
}
if(num != ""){
result.add(num);
}
return result;
}

/**
* 将中缀表达式转化为后缀表达式
* @param inOrderList
* @return
*/
public static ArrayList<String> getPostOrder(ArrayList<String> inOrderList){

ArrayList<String> result = new ArrayList<String>();
Stack<String> stack = new Stack<String>();
for (int i = 0; i < inOrderList.size(); i++) {
if(Character.isDigit(inOrderList.get(i).charAt(0))){
result.add(inOrderList.get(i));
}else{
switch (inOrderList.get(i).charAt(0)) {
case '(':
stack.push(inOrderList.get(i));
break;
case ')':
while (!stack.peek().equals("(")) {
result.add(stack.pop());
}
stack.pop();
break;
default:
while (!stack.isEmpty() && compare(stack.peek(), inOrderList.get(i))){
result.add(stack.pop());
}
stack.push(inOrderList.get(i));
break;
}
}
}
while(!stack.isEmpty()){
result.add(stack.pop());
}
return result;
}

/**
* 计算后缀表达式
* @param postOrder
* @return
*/
public static Integer calculate(ArrayList<String> postOrder){
Stack stack = new Stack();
for (int i = 0; i < postOrder.size(); i++) {
if(Character.isDigit(postOrder.get(i).charAt(0))){
stack.push(Integer.parseInt(postOrder.get(i)));
}else{
Integer back = (Integer)stack.pop();
Integer front = (Integer)stack.pop();
Integer res = 0;
switch (postOrder.get(i).charAt(0)) {
case '+':
res = front + back;
break;
case '-':
res = front - back;
break;
case '*':
res = front * back;
break;
case '/':
res = front / back;
break;
}
stack.push(res);
}
}
return (Integer)stack.pop();
}

/**
* 比较运算符等级
* @param peek
* @param cur
* @return
*/
public static boolean compare(String peek, String cur){
if("*".equals(peek) && ("/".equals(cur) || "*".equals(cur) ||"+".equals(cur) ||"-".equals(cur))){
return true;
}else if("/".equals(peek) && ("/".equals(cur) || "*".equals(cur) ||"+".equals(cur) ||"-".equals(cur))){
return true;
}else if("+".equals(peek) && ("+".equals(cur) || "-".equals(cur))){
return true;
}else if("-".equals(peek) && ("+".equals(cur) || "-".equals(cur))){
return true;
}
return false;
}

public static void search(int flag, int op) {
num[flag * 2] = operator[op];
if (flag == 3) {
StringBuffer express=new StringBuffer();
for(int i=1;i<8;i++)
express.append(num[i]);
//System.out.println(express);
String s=new String(express);
//System.out.println(s);
ArrayList result = getStringList(s);
result = getPostOrder(result);   //中缀变后缀
int temp = calculate(result);   //计算
if (temp == X) {
count++;
System.out.println(s);//输出所有表达式值=24的组合
//System.out.println(Arrays.toString(num));//输出所有表达式值=24的组合
}
return;
}
search(flag + 1, 0);
search(flag + 1, 1);
search(flag + 1, 2);
search(flag + 1, 3);
}

public static void main(String[] args) {
Scanner sca = new Scanner(System.in);
X = 24;
for(int i=0;i<8;i=i+2){
num[i]="";
num[i+1]=String.valueOf(sca.nextInt());
}
//System.out.println(Arrays.toString(num));
search(0, 0);
if(count>0)
System.out.print("true");
else System.out.print("false");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: