经常跟儿子玩24点,有时候比较难算的,算一会儿,两人算不出来,就收了,当作没法算。

以我的数学能力,一般来说,算不出来的,大概率确实是算不出来的。

但是遇到比较变态的,当作算不出来是可能的,所以一直想找一个直接能解24点的程序。

可是网上找了一圈,一直没找到。

想着自己写一个,可是这里面的逻辑一直理不清楚,不知道这个算法应该怎么写。

下午坐在电脑前面想的时候,不知道为啥,像是突然开窍了。写着写着居然写出来了。

贴出来供有兴趣的朋友参考,有问题请指正。

using System;
using System.Collections.Generic;
using System.Diagnostics; namespace Calc24Point
{
internal class Program
{
private static void Main(string[] args)
{
var items = CalcHelper.CalcResult(3, 3, 8, 8);
foreach (var item in items)
{
Console.WriteLine(item);
} Console.ReadKey();
}
} public class CalcHelper
{
public static List<string> CalcResult(double a, double b, double c, double d)
{
List<string> myList = new List<string>();
List<CalcInfo> items = MakeCalcs(a, b, c, d);
foreach (var item in items)
{
var result = item.GetResult();
if (double.IsNaN(result) == false && IsEqual(result, 24))
{
var text = item.GetString();
if (myList.Contains(text) == false)
{
myList.Add(text);
}
}
} return myList;
} private static bool IsEqual(double a, double b)
{
return Math.Abs(a - b) < 0.000001;
} private static List<CalcInfo> MakeCalcs(double a, double b, double c, double d)
{
var items = new List<CalcInfo>();
items.AddRange(MakeCalcs(a, (b, c, d)));
items.AddRange(MakeCalcs(b, (a, c, d)));
items.AddRange(MakeCalcs(c, (b, a, d)));
items.AddRange(MakeCalcs(d, (b, c, a))); return items;
} private static IEnumerable<CalcInfo> MakeCalcs(double item1, (double b, double c, double d) p)
{
foreach (CalcInfo item2 in MakeCalcs(p.b, (p.c, p.d)))
{
yield return new CalcInfo(item1, item2, EMode.加);
yield return new CalcInfo(item1, item2, EMode.减);
yield return new CalcInfo(item2, item1, EMode.减);
yield return new CalcInfo(item1, item2, EMode.乘);
yield return new CalcInfo(item1, item2, EMode.除);
yield return new CalcInfo(item2, item1, EMode.除);
} foreach (CalcInfo item2 in MakeCalcs(p.c, (p.b, p.d)))
{
yield return new CalcInfo(item1, item2, EMode.加);
yield return new CalcInfo(item1, item2, EMode.减);
yield return new CalcInfo(item2, item1, EMode.减);
yield return new CalcInfo(item1, item2, EMode.乘);
yield return new CalcInfo(item1, item2, EMode.除);
yield return new CalcInfo(item2, item1, EMode.除);
} foreach (CalcInfo item2 in MakeCalcs(p.d, (p.b, p.c)))
{
yield return new CalcInfo(item1, item2, EMode.加);
yield return new CalcInfo(item1, item2, EMode.减);
yield return new CalcInfo(item2, item1, EMode.减);
yield return new CalcInfo(item1, item2, EMode.乘);
yield return new CalcInfo(item1, item2, EMode.除);
yield return new CalcInfo(item2, item1, EMode.除);
}
} private static IEnumerable<CalcInfo> MakeCalcs(double item1, (double c, double d) p)
{
foreach (CalcInfo item2 in MakeCalcs(p.c, p.d))
{
yield return new CalcInfo(item1, item2, EMode.加);
yield return new CalcInfo(item1, item2, EMode.减);
yield return new CalcInfo(item2, item1, EMode.减);
yield return new CalcInfo(item1, item2, EMode.乘);
yield return new CalcInfo(item1, item2, EMode.除);
yield return new CalcInfo(item2, item1, EMode.除);
}
} private static IEnumerable<CalcInfo> MakeCalcs(double item1, double item2)
{
yield return new CalcInfo(item1, item2, EMode.加);
yield return new CalcInfo(item1, item2, EMode.减);
yield return new CalcInfo(item2, item1, EMode.减);
yield return new CalcInfo(item1, item2, EMode.乘);
yield return new CalcInfo(item1, item2, EMode.除);
yield return new CalcInfo(item2, item1, EMode.除);
}
} public class CalcInfo
{
public CalcInfo Items1 { get; set; }
public CalcInfo Items2 { get; set; }
public EMode? Mode { get; set; }
public double Result { get; set; } public CalcInfo(double value)
{
Result = value;
} public CalcInfo(double value1, double value2, EMode mode) : this(new CalcInfo(value1), new CalcInfo(value2), mode)
{
} public CalcInfo(double value1, CalcInfo value2, EMode mode) : this(new CalcInfo(value1), value2, mode)
{
} public CalcInfo(CalcInfo value1, double value2, EMode mode) : this(value1, new CalcInfo(value2), mode)
{
} public CalcInfo(CalcInfo value1, CalcInfo value2, EMode mode)
{
Items1 = value1;
Items2 = value2;
Mode = mode;
} public double GetResult()
{
if (Mode == null)
{
return Result;
} var item1 = Items1.GetResult();
var item2 = Items2.GetResult();
if (double.IsNaN(item1) || double.IsNaN(item1))
{
return double.NaN;
} switch (Mode.Value)
{
case EMode.加:
return item1 + item2;
case EMode.减:
return item1 - item2;
case EMode.乘:
return item1 * item2;
case EMode.除:
if (item2 == 0)
{
return double.NaN;
} return item1 / item2;
default:
Debug.Assert(false);
break;
} return double.NaN;
} public string GetString()
{
if (Mode == null)
{
return Result.ToString();
} switch (Mode.Value)
{
case EMode.加:
return $"({Items1.GetString()} + {Items2.GetString()})";
case EMode.减:
return $"({Items1.GetString()} - {Items2.GetString()})";
case EMode.乘:
return $"({Items1.GetString()} * {Items2.GetString()})";
case EMode.除:
return $"({Items1.GetString()} / {Items2.GetString()})";
default:
Debug.Assert(false);
break;
} return null;
}
} public enum EMode
{
加,
减,
乘,
除,
}
}

C# 24点游戏求解算法的更多相关文章

  1. php实现 24点游戏算法

    php实现 24点游戏算法 一.总结 一句话总结:把多元运算转化为两元运算,先从四个数中取出两个数进行运算,然后把运算结果和第三个数进行运算,再把结果与第四个数进行运算.在求表达式的过程中,最难处理的 ...

  2. 24点游戏(24 game)的C++编程求解实现

    什么是24点游戏 24点游戏,英文叫做24 game,是对给定的4个非负整数进行加减乘除运算,要求每个数都要被用到且仅用到一次,并得到最终的运算结果为24.比如3.8.3.8这四个数,可以找出唯一的一 ...

  3. 【Nodejs】“快算24”扑克牌游戏算法

    算24是一款扑克牌游戏,它的游戏方式是把四张牌的牌面数值通过四则运算得到结果24,四张牌必须仅用一次.这是一种挺好的锻炼孩子算数能力的扑克牌游戏. 各地玩法还有点差别,有的只算1-10,其它抽出来:有 ...

  4. 经典趣味24点游戏程序设计(python)

    一.游戏玩法介绍: 24点游戏是儿时玩的主要益智类游戏之一,玩法为:从一副扑克中抽取4张牌,对4张牌使用加减乘除中的任何方法,使计算结果为24.例如,2,3,4,6,通过( ( ( 4 + 6 ) - ...

  5. cdoj 1252 24点游戏 dfs

    24点游戏 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1252 Descr ...

  6. 24点游戏&&速算24点(dfs)

    24点游戏 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...

  7. 24点游戏详细截图介绍以及原型、Alpha、Beta对比

    原型设计 图片展示 功能与界面设计 1.登录注册 2.手机号验证 3.24点游戏 4.粉色系女生界面 Alpha 图片展示 功能与界面设计 1.24点游戏 2.背景音乐 3.可查看多种可能的答案 4. ...

  8. 原根求解算法 && NTT算法

    原根求解算法: 获取一个数\(N\)的原根\(root\)的算法 #include<bits/stdc++.h> #define ll long long #define IL inlin ...

  9. bzoj1215 24点游戏

    Description 为了培养小孩的计算能力,大人们经常给小孩玩这样的游戏:从1付扑克牌中任意抽出4张扑克,要小孩用“+”.“-”.“×”.“÷”和括号组成一个合法的表达式,并使表达式的值为24点. ...

随机推荐

  1. pr中打开Audition编辑剪辑?

    前景 现在一般的adobe全家桶都是一键安装破解. 天翼网盘链接,下载不限速,没有账号就现注册一个即可. https://cloud.189.cn/t/UZRjuqAZ3E7r (访问码:8ago) ...

  2. 求曲线y=lnx在区间(2,6)内的一条切线,使得该切线与直线x=2,x=6及曲线y=lnx所围成的图形的面积最小。

    求曲线y=lnx在区间(2,6)内的一条切线,使得该切线与直线x=2,x=6及曲线y=lnx所围成的图形的面积最小. 1.先画图. 2.设切点为(a,lna) (2<a<6) 3.切线方程 ...

  3. Faust——python分布式流式处理框架

    摘要 Faust是用python开发的一个分布式流式处理框架.在一个机器学习应用中,机器学习算法可能被用于数据流实时处理的各个环节,而不是仅仅在推理阶段,算法也不仅仅局限于常见的分类回归算法,而是会根 ...

  4. VBO、VAO和EBO

    Vertex Buffer Object 对于经历过fixed pipeline的我来讲,VBO的出现对于渲染性能提升让人记忆深刻.完了,暴露年龄了~ //immediate mode glBegin ...

  5. Junit单元测试&反射&注解

    内容索引 1. Junit单元测试 2. 反射 3. 注解 Junit单元测试: * 测试分类: 1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值. 2. 白盒测试:需要写代码的.关 ...

  6. python分析《三国演义》,谁才是这部书的绝对主角(包含统计指定角色的方法)

    前面分析统计了金庸名著<倚天屠龙记>中人物按照出现次数并排序 https://www.cnblogs.com/becks/p/11421214.html 然后使用pyecharts,统计B ...

  7. 用fseek和ftell获取文件的大小

    #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc,char ...

  8. Pytorch_Part6_正则化

    VisualPytorch beta发布了! 功能概述:通过可视化拖拽网络层方式搭建模型,可选择不同数据集.损失函数.优化器生成可运行pytorch代码 扩展功能:1. 模型搭建支持模块的嵌套:2. ...

  9. mysql多线程备份与还原工具mydumper

    (一)mydumper介绍 之前我们已经学过如何使用mysqldump备份恢复数据库:<mysql逻辑备份与还原工具mysqldump>,就目前来说,mysqldump是使用最广泛的MyS ...

  10. .NET平台系列8 .NET Core 各版本新功能

    系列目录     [已更新最新开发文章,点击查看详细] .NET Core 自2016年6月27日发布第一个正式版本以来,它主打的跨平台和高性能特效吸引了许多开发者,包括Java.PHP等语言的开发者 ...