暴力模拟解决 速算24点游戏-java

该博客文章介绍了一个使用Java编写的程序,该程序通过深度优先搜索(DFS)和递归算法来寻找四个给定数字的不同运算组合,使得这些运算结果等于24。程序处理了浮点数精度问题,并尝试了所有可能的括号排列。文章还展示了如何在不同运算符(加、减、乘、除)之间插入括号以得到正确结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

蒟蒻解法-┭┮﹏┭┮,别乱学,第一次发,还在摸索咋样排版,写解释

import java.io.IOException;
import java.util.Scanner;
public class Main
{   
    static Scanner in=new Scanner(System.in);
    static double an[]=new double[4];
    static double bn[]=new double[4];
    static int cn[]=new int[4];
    public static void main(String[] args)throws IOException
    {     
//      bn[0]=8;bn[1]=3;bn[2]=8;bn[3]=3;
//      System.out.println(yunsuan(4, 2, 4)?"Yes":"No");
//      System.out.println(8*1.0/(3-8*1.0/3));
//      System.out.println(8*1.0/(3-8*1.0/3)==24);//爆java精度了
        while (in.hasNext())
        {
            cn=new int[4];
            for(int i=0;i<4;i++)an[i]=in.nextInt();
            System.out.println(dfs(4,0)?"Yes":"No");
        }      
        System.gc();
    }
//  24/3---9/3 9/3 64/8 64/8
    static boolean dfs(int len,int index)//打乱,排列组合出4*3*2=24种排列方式
    {
        if(index==len)
        {
//          for(int i=0;i<4;i++)System.out.print(cn[i]+" ");
//          System.out.println();
            return order();
        }
        for(int i=0;i<4;i++)
        {
            boolean flag=true;
            for(int j=0;j<index;j++)
            {
              if(cn[j]==i) {flag=false;break;}
            }
            if(flag)
            {
                bn[index]=an[i];
                cn[index]=i;
                if(dfs(len,index+1))return true;
            }
        }
        return false;
    }
 
    static boolean order() //4个数中插入3个符号
    {
 
        int s[]= {1,2,3,4};//+,-,*,/
        for(int i=0;i<4;i++)
        {
            for(int j=0;j<4;j++)
          {
                for(int k=0;k<4;k++)
                {
                    if(yunsuan(s[i],s[j],s[k]))return true;
                }
            }
        }
        return false;
    }
    static char[] ss= {'+','-','*','/'};
    static boolean yunsuan(int i,int j,int k) //加括号
    {
        double ans=jisuan(bn[0], jisuan(bn[1],jisuan(bn[2], bn[3],k), j), i);
        if(Math.abs(ans-24)<=(double)(1e-6)) //a(b,(c,d))
        {
        	System.out.printf("%.0f%c(%.0f%c(%.0f%c%.0f))",bn[0],ss[i-1],bn[1],ss[j-1],bn[2],ss[k-1],bn[3]);
            return true;
        }
        ans=jisuan(bn[0],jisuan(jisuan(bn[1],bn[2],j), bn[3],k),i);
        if(Math.abs(ans-24)<=(double)(1e-6))//a((b,c)d)
        {
        	System.out.printf("%.0f%c((%.0f%c%.0f)%c%.0f)",bn[0],ss[i-1],bn[1],ss[j-1],bn[2],ss[k-1],bn[3]);
            return true;
        }
        ans=jisuan(jisuan(bn[0], bn[1], i), jisuan(bn[2],bn[3],k), j);
        if(Math.abs(ans-24)<=(double)(1e-6))//(a,b)(c,d)
        {
        	System.out.printf("(%.0f%c%.0f)%c(%.0f%c%.0f)",bn[0],ss[i-1],bn[1],ss[j-1],bn[2],ss[k-1],bn[3]);
            return true;
        }
        ans=jisuan(jisuan(jisuan(bn[0], bn[1], i),bn[2],j),bn[3],k);
        if(Math.abs(ans-24)<=(double)(1e-6))//((a,b)c)d
        {
        	System.out.printf("((%.0f%c%.0f)%c%.0f)%c%.0f",bn[0],ss[i-1],bn[1],ss[j-1],bn[2],ss[k-1],bn[3]);
            return true;
        }  
        ans=jisuan(jisuan(bn[0], jisuan(bn[1], bn[2],j), i),bn[3],k);
        if(Math.abs(ans-24)<=(double)(1e-6))//(a(b,c))d
        {
        	System.out.printf("(%.0f%c(%.0f%c%.0f))%c%.0f",bn[0],ss[i-1],bn[1],ss[j-1],bn[2],ss[k-1],bn[3]);
            return true;
        }
        return false;
    }
    static double jisuan(double x,double d,int flag)
    {
        switch (flag)
        {
        case 1:return x+d;
        case 2:return x-d;
        case 3:return x*d;
        case 4:if(d!=0)return x/d;else return 1000007;
        }
        return 1000007;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值