zoukankan      html  css  js  c++  java
  • 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;
        }
    
    }
  • 相关阅读:
    构建之法阅读心得(九)
    构建之法阅读心得(八)
    构建之法阅读心得(七)
    构建之法阅读心得(六)
    构建之法阅读心得(五)
    构建之法阅读心得(四)
    一组阶段小记之读构建之法(三)
    暑期学习总结
    软工综合实践 学习笔记02
    软工综合实践 学习笔记01
  • 原文地址:https://www.cnblogs.com/xiaoxueyong/p/xiaoxueyong.html
Copyright © 2011-2022 走看看