zoukankan      html  css  js  c++  java
  • 第1章 游戏之乐——点游戏

    点游戏

    1. 问题描述:

      给玩家4张牌,每张牌的面值在1-13之间,允许其中有数值相同的牌,采用加、减、乘、除四则运算,允许中间运算存在小数,并且可以使用括号,但每张牌只能用一次。构造表达式,使其结果为24。  

      输入: n1, n2, n3, n4 (1~13)

      输出: 若能得到运算结果为 24, 则输出一个对应的运算表达式

    如:

      输入: 11, 8, 3, 5

      输出: (11-8) * (3*5) = 24

    2. 【解法一】穷举法

    代码如下:

      1 package chapter1youxizhilePointsGame;
      2 
      3 import java.util.Scanner;
      4 
      5 /**
      6  * 点游戏(24点)
      7  * 【解法一】穷举法
      8  * @author DELL
      9  *
     10  */
     11 public class PointsGame1 {
     12     public static final double Precision = 1E-6;  //精度
     13     public static final int CardsNumber = 4;  //牌的数量
     14     public static final int ResultValue = 24; //要求的运算结果值
     15     private double[] number;  //所有可能的四则运算所得到的值,初始为牌的值
     16     private String[] result;  //存放要输出的四则运算结果字符串
     17     //构造函数对数组进行初始化
     18     public PointsGame1(){
     19         number = new double[CardsNumber];
     20         result = new String[CardsNumber];
     21         Scanner input = new Scanner(System.in);
     22         System.out.print("请输入"+CardsNumber+"张牌的值(以空格分隔):");
     23         for(int i=0;i<CardsNumber;i++){
     24             number[i] = input.nextInt();
     25             result[i] = Double.toString(number[i]);
     26         }
     27 
     28     }
     29     /**
     30      * 穷举计算的函数
     31      * @param n 四则运算结果的数量,初始为牌的数量
     32      * @return 是否可以找到对应的运算表达式
     33      */
     34     public boolean pointsGame(int n){
     35         if(n==1){
     36             if(Math.abs(number[0]-ResultValue)<=Precision){
     37                 System.out.println("满足条件的运算表达式为:"+result[0]);
     38                 return true;
     39             }else{
     40                 return false;
     41             }
     42         }
     43         for(int i=0;i<n;i++){
     44             for(int j=i+1;j<n;j++){
     45                 double a,b;  //当前取出的两个数
     46                 String expa,expb;  //当前存储的四则运算字符串
     47                 a = number[i];
     48                 b = number[j];
     49                 number[j] = number[n-1];
     50                 
     51                 expa = result[i];
     52                 expb = result[j];
     53                 result[j] = result[n-1];
     54                 //加法运算
     55                 number[i] = a + b;
     56                 result[i] = "("+expa+"+"+expb+")";
     57                 if(pointsGame(n-1))
     58                     return true;
     59                 //减法运算
     60                 number[i] = a - b;
     61                 result[i] = "("+expa+"-"+expb+")";
     62                 if(pointsGame(n-1))
     63                     return true;
     64                 
     65                 number[i] = b - a;
     66                 result[i] = "("+expb+"-"+expa+")";
     67                 if(pointsGame(n-1))
     68                     return true;
     69                 //乘法运算
     70                 number[i] = a * b;
     71                 result[i] = "("+expa+"*"+expb+")";
     72                 if(pointsGame(n-1))
     73                     return true;
     74                 //除法运算
     75                 if(b!=0){
     76                     number[i] = a / b;
     77                     result[i] = "("+expa+"/"+expb+")";
     78                     if(pointsGame(n-1))
     79                         return true;
     80                 }
     81                 
     82                 if(a!=0){
     83                     number[i] = b / a;
     84                     result[i] = "("+expb+"/"+expa+")";
     85                     if(pointsGame(n-1))
     86                         return true;
     87                 }
     88                 //如果还没找到,就恢复原来的状态继续下一轮搜索
     89                 number[i] = a;
     90                 number[j] = b;
     91                 result[i] = expa;
     92                 result[j] = expb;
     93             }
     94         }
     95         return false;
     96     }
     97     
     98     public static void main(String[] args) {
     99         PointsGame1 pg = new PointsGame1();
    100         if(pg.pointsGame(CardsNumber)){
    101             System.out.println("构造成功!");
    102         }else
    103             System.out.println("构造失败!");
    104     }
    105 
    106 }

    程序运行结果如下:

    请输入4张牌的值(以空格分隔):11 8 3 5
    满足条件的运算表达式为:(((11.0-8.0)+5.0)*3.0)
    构造成功!

     【方法二】参考链接:

    编程之美-24点游戏

    编程之美24点游戏感悟

    《编程之美》读书笔记22: 1.16 24点游戏

  • 相关阅读:
    NERDTree 快捷件
    atom安装插件
    flask/sqlalchemy
    python中SQL的使用
    vim配置
    Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights
    address-already in use 以及查看端口
    github桌面工具commit不了解决
    git add 所有文件
    Beta 冲刺(5/7)
  • 原文地址:https://www.cnblogs.com/gaopeng527/p/4613624.html
Copyright © 2011-2022 走看看