Java利用递归算法实现24点游戏

//package TwentyfourGame;

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

public class PointGame {
    public static void main(String[] args) {
        //输入提示
        System.out.println("—————————欢迎进入24点游戏———————————");
        System.out.println("请随机输入四个1-13之间的整数(以空格隔开):");
        ArrayList<Integer> list = inputNum();   //调用输入函数
        tfCal(list, new ArrayList<String>());   //计算24点方法, 实参list为输入的数据, new ArrayList<String>()用来 表示计算过程
        System.out.println("——————————————end———————————————");
    }

    //输入方法,将输入的四个数存入数组队列list中,并返回
    private static ArrayList<Integer> inputNum() {
        ArrayList<Integer> alist = new ArrayList<Integer>();  //ArrayList<Integer>表示只能接收整型数据
        Scanner scanner = new Scanner(System.in);
        for (int i = 0; i < 4; i++) {         //将四个数添加到数组队列中
            alist.add(scanner.nextInt());
        }
        return alist;  //返回值为数组队列中的四个数
    }

    //计算24点游戏的方法
    public static void tfCal(ArrayList<Integer> list, ArrayList<String> str) {
        int length = list.size();
        if (length > 1) {
            /**利用双重循环取出两个数的计算所有情况
             *list的长度为4,那么第一个数的下标和第二个数的下标分别为
             * 0  1
             * 1  2
             * 2  3
             */
            for (int i = 0; i < length - 1; i++) {
                for (int j = i + 1; j < length; j++) {
                    //加法运算
                    int b = list.remove(j);  //移除list中的下标为j的元素,并将此数赋值给b
                    int a = list.remove(i);  //同上,将值赋给a
                    list.add(0, a + b);      //将两数的计算结果添加到原队列
                    str.add(a + "+" + b + "=" + (a + b));//此处是保存计算的过程
                    tfCal(list, str);    //递归调动
                    //下面四句话是为了还原list队列,特别强调进栈和出栈的顺序
                    list.remove(0);
                    list.add(i, a);
                    list.add(j, b);
                    str.remove(str.size() - 1);

                    //减运算(a-b),原理与上面加法计算相同
                    b = list.remove(j);
                    a = list.remove(i);
                    list.add(0, a - b);
                    str.add(a + "-" + b + "=" + (a - b));
                    tfCal(list, str);
                    list.remove(0);
                    list.add(i, a);
                    list.add(j, b);
                    str.remove(str.size() - 1);

                    //减运算(b-a)
                    b = list.remove(j);
                    a = list.remove(i);
                    list.add(0, b - a);
                    str.add(b + "-" + a + "=" + (b - a));
                    tfCal(list, str);
                    list.remove(0);
                    list.add(i, a);
                    list.add(j, b);
                    str.remove(str.size() - 1);

                    //乘运算
                    b = list.remove(j);
                    a = list.remove(i);
                    list.add(0, a * b);
                    str.add(a + "*" + b + "=" + (a * b));
                    tfCal(list, str);
                    list.remove(0);
                    list.add(i, a);
                    list.add(j, b);
                    str.remove(str.size() - 1);

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

                    //除运算(b/a)
                    b = list.remove(j);
                    a = list.remove(i);
                    if (a != 0 && b % a == 0) {
                        list.add(0, b / a);
                        str.add(b + "/" + a + "=" + (b / a));
                        tfCal(list, str);
                        list.remove(0);
                        list.add(i, a);
                        list.add(j, b);
                        str.remove(str.size() - 1);
                    } else {
                        list.add(i, a);
                        list.add(j, b);
                    }
                }
            }
        } else {
            if (str.get(str.size() - 1).endsWith("=24")) {   //endsWith()方法用于测试字符串是否以指定后缀结束
                for (String temp : str) {
                    System.out.print(temp + " ");
                }
                System.out.println();
            }
        }
    }
}
—————————欢迎进入24点游戏———————————
请随机输入四个1-13之间的整数(以空格隔开):
8 5 6 2
8-5=3 6+2=8 8*3=24 
8+6=14 5*2=10 10+14=24 
8-2=6 6*5=30 30-6=24 
8-2=6 5*6=30 30-6=24 
2-8=-6 5*6=30 30+-6=24 
5-6=-1 2--1=3 3*8=24 
6-5=1 1+2=3 3*8=24 
5*6=30 30-8=22 22+2=24 
5*6=30 8-30=-22 2--22=24 
5*6=30 30+2=32 32-8=24 
5*6=30 8-2=6 30-6=24 
5*6=30 2-8=-6 -6+30=24 
5-2=3 6-3=3 3*8=24 
2-5=-3 -3+6=3 3*8=24 
5*2=10 10+8=18 18+6=24 
5*2=10 10+6=16 16+8=24 
5*2=10 8+6=14 14+10=24 
6+2=8 8-5=3 3*8=24 
6+2=8 8-5=3 3*8=24 
——————————————end———————————————
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值