24点游戏算法

游戏介绍:

24点游戏玩法很简单,一副扑克去掉花牌(J、Q、K、大小王),剩余的40张任意抽选4张,通过加减乘除计算出24点。

算法思路:

需要有递归的思想,在这里我就不介绍递归了,不了的可以去了解了解。

下面介绍我的算法思路,一共分为以下几个步骤:

1、将四个数放入链表(注意是链表,不是数组),每次取出两个数;

2、判断链表里面有几个数,若只有一个数并且值是24则输出计算结果结束,若大于一个数则进行步骤3;

3.1将这两个数做加运算,然后将结果放入原队列,重复步骤2,还原列表中最初取出的两个数;

3.2将这两个数做减运算(注意减法具有交换性),然后将结果放入原队列,重复步骤2,还原列表中最初取出的两个数;

3.3将这两个数做乘运算,然后将结果放入原队列,重复步骤2,还原列表中最初取出的两个数;

3.4将这两个数做除运算(注意除法具有交换性),然后将结果放入原队列,重复步骤2,还原列表中最初取出的两个数;

以下是我的程序,可以按照算法的步骤一步一步来看:不懂的可以加qq联系我532450203

import java.util.ArrayList;
import java.util.Scanner;

public class Main24 {

    public static void main(String[] args) {
        System.out.println("24点游戏计算,输入四个1-10的整数,以空格隔开,自动计算24点:");
        ArrayList<Integer> list = input();//输入函数
        fun(list, new ArrayList<String>());//计算24点方法
    }

    private static void fun(ArrayList<Integer> list, ArrayList<String> s) {
        int length = list.size();
        if (length > 1) {
            for (int i = 0; i < length - 1; i++) {//二重循环取出两个数的所有情况
                for (int k = i + 1; k < length; k++) {
                    //加运算
                    int b = list.remove(k);
                    int a = list.remove(i);
                    list.add(0, a + b);//将计算结果添加到原队列
                    s.add(a + "+" + b + "=" + (a + b));//此处是保存计算的过程
                    fun(list, s);//递归调动
                    //下面四句话是为了还原list队列,特别强调进栈和出栈的顺序
                    list.remove(0);
                    list.add(i, a);
                    list.add(k, b);
                    s.remove(s.size() - 1);

                    //减运算
                    b = list.remove(k);
                    a = list.remove(i);
                    list.add(0, a - b);
                    s.add(a + "-" + b + "=" + (a - b));
                    fun(list, s);
                    list.remove(0);
                    list.add(i, a);
                    list.add(k, b);
                    s.remove(s.size() - 1);

                    //减运算
                    b = list.remove(k);
                    a = list.remove(i);
                    list.add(0, b - a);
                    s.add(b + "-" + a + "=" + (b - a));
                    fun(list, s);
                    list.remove(0);
                    list.add(i, a);
                    list.add(k, b);
                    s.remove(s.size() - 1);

                    //乘运算
                    b = list.remove(k);
                    a = list.remove(i);
                    list.add(0, a * b);
                    s.add(a + "*" + b + "=" + (a * b));
                    fun(list, s);
                    list.remove(0);
                    list.add(i, a);
                    list.add(k, b);
                    s.remove(s.size() - 1);

                    //除运算
                    b = list.remove(k);
                    a = list.remove(i);
                    if (b != 0 && a % b == 0) {
                        list.add(0, a / b);
                        s.add(a + "/" + b + "=" + (a / b));
                        fun(list, s);
                        list.remove(0);
                        list.add(i, a);
                        list.add(k, b);
                        s.remove(s.size() - 1);
                    } else {
                        list.add(i, a);
                        list.add(k, b);
                    }

                    //除运算
                    b = list.remove(k);
                    a = list.remove(i);
                    if (a != 0 && b % a == 0) {
                        list.add(0, b / a);
                        s.add(b + "/" + a + "=" + (b / a));
                        fun(list, s);
                        list.remove(0);
                        list.add(i, a);
                        list.add(k, b);
                        s.remove(s.size() - 1);
                    } else {
                        list.add(i, a);
                        list.add(k, b);
                    }
                }
            }
        } else {
            if (s.get(s.size() - 1).endsWith("=24")) {
                for (String temp : s) {
                    System.out.print(temp + " ");
                }
                System.out.println();
            }

        }
    }

    private static ArrayList<Integer> input() {
        ArrayList<Integer> list = new ArrayList<Integer>();
        Scanner scanner = new Scanner(System.in);
        for (int i = 0; i < 4; i++) {
            list.add(scanner.nextInt());
        }
        return list;
    }

}
原文地址:https://www.cnblogs.com/xiaoxueyong/p/xiaoxueyong.html