当业务逻辑很复杂,涉及多个条件的真假,或者多种条件下都会执行同一动作时,如何编写紧凑的if语句呢?本文借由一个实际例子,利用数学的布尔逻辑整理条件,最终产生if语句。

问题

在《X3 重聚》里,宇宙是一个个星区由跳跃门连接起来的。大多数星区是相邻的,也有部分星区是非连通的。这是X3 重聚星系图,右下的红色星区就是非连通星区。

飞船从一个星区到另一个星区有两种方法,一是老老实实飞过去,二是跃迁过去。跃迁的话飞船要装有跃迁引擎和足够能量。能量由发电机供应。跃迁是跃迁到目的星区的跳跃门,跳跃门那里不能太挤,否则飞船会和其他飞船相撞。去非连通星区只能靠跃迁。

问题来了。给定一艘船和它的当前星区以及目的星区,求该船到目的星区的方法,要求尽量使用跃迁,但如果目的星区和当前星区只有1跳远,则不必跃迁。(在星系图里,最左上的Kingdom End距Rolk's Drift是1跳远,距下面的Ringo Moon是3跳远)

解答

首先把问题简化,转化为数学表达。

  • a: 当前星区与目的星区距离等于1跳
  • b: 有跃迁引擎和足够能量
  • c: 目的星区是连通的
  • d: 跳跃门附近是空旷的
if(!a && b && d)
// 立即跃迁 if(!a && b && !d)
// 可以跃迁但跳跃门附近有船。
// 为避免撞船,等待一会儿 if(!b && c)
// 老老实实飞过去

上面这个代码是不完善的。第一条件a,b,d等可能被重复测试,第二我们不知道有没有3个if都没走进去的情况。我们想要把上面的代码变成if-else if-...-else-end的形式。

我们从寻找else的意义的角度入手,就是查看什么情况下“不跳、不等、不飞”。

不跳 && 不等 && 不飞 = !(!a && b &&d) && !(!a && b && !d) && !(!b && c)

下面化简这个等式的右边部分,我将改用布尔逻辑的符号。

xxx

   --德·摩根定律

  --分配律

 --幂等律、互补律、有界律

  --有界律、分配律

 --互补律、有界律

 --互补律、有界律

如果用Mathematica求解,用BooleanMinimize。只是没有步骤了。

为了防止情况错漏,再把结果展开为a,b,c,d四元的合取范式,其中,a&&b&&c&&d || a&&b&&c&&!d是要飞的,是一开始漏掉的情况。再重新化简飞的情况:

简化异常的情况:

那么,四种情况都厘清了。所以可以得出一个基本的if-else if-..else-end语句了。

if (!a && b && d)
{
//立即跃迁
}
else if (!a && b && !d)
{
//可以跃迁但跳跃门附近有船。
//为避免撞船,等待一会儿
}
else if (!b && c || a && c)
{
//老老实实飞过去
}
else//a && !c || !b && !c
{
//异常
}

保险起见,我们再检查一下情况是不是都全了:

返回true,说明情况没有遗漏。

所以我们知道,if-else if-..else-end语句的本质是合取范式,而if的嵌套则是析取。1=(!a && b && d) || (!a && b && !d) || (!b && c || a && b) || (!b && !c)。我再把同类项合并起来,创建一个嵌套的if语句。

(!a && b) && (d || !d) || (!b && c || a && b) || (!b && !c),对应的if就是

if (!a && b)
{
if (d)
{
//立即跃迁
}
else//!d
{
//可以跃迁但跳跃门附近有船。
//为避免撞船,等待一会儿
}
}
else if (!b && c || a && c)
{
//老老实实飞过去
}
else//a && !c || !b && !c
{
//异常
}

http://blog.csdn.net/gqqnb/article/details/10507481

化简复杂逻辑,编写紧凑的if条件语句的更多相关文章

  1. 化简复杂逻辑,编写紧凑的if条件语句(二):依据if子句顺序化简条件

    <化简复杂逻辑,编写紧凑的if条件语句>已经得出了跳.等.飞.异常的各自条件,方便起见这里重新贴一下. 立即跃迁:!a && b && d 等待跃迁:!a ...

  2. 不要使用短路逻辑编写 stl sorter 多条件比较

    前言 最近工期紧.任务多,没有时间更新博客,就水一期吧.虽然是水,也不能太水,刚好最近工作中遇到一个 sorter 多条件排序的问题,花费了半天时间来定位解决,就说说它吧. 背景 公司产品是一个跨端的 ...

  3. 【mongoDB高级篇②】大数据聚集运算之mapReduce(映射化简)

    简述 mapReduce从字面上来理解就是两个过程:map映射以及reduce化简.是一种比较先进的大数据处理方法,其难度不高,从性能上来说属于比较暴力的(通过N台服务器同时来计算),但相较于grou ...

  4. 线性代数-矩阵-【5】矩阵化简 C和C++实现

    点击这里可以跳转至 [1]矩阵汇总:http://www.cnblogs.com/HongYi-Liang/p/7287369.html [2]矩阵生成:http://www.cnblogs.com/ ...

  5. scala 数据结构(九):-filter、化简

    1 filter filter:将符合要求的数据(筛选)放置到新的集合中 应用案例:将 val names = List("Alice", "Bob", &qu ...

  6. NOIP201402比例化简

    比例化简 [问题描述]在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果.例如,对某一观点表示支持的有 1498 人,反对的有 902 人,那么赞同与反对的比例可以简单的记为1498:9 ...

  7. YZOI Easy Round 2_化简(simplify.c/cpp/pas)

    Description 给定一个多项式,输出其化简后的结果. Input 一个字符串,只含有关于字母x 的多项式,不含括号与分式,没有多余的空格. Output 一个字符串,化简后的多项式,按照次数从 ...

  8. 《Linear Algebra and Its Application》-chaper1-行化简法解决线性方程组

    在实际生产生活中,需要我们解大量的线性方程组,例如是有探测.线性规划.电路等,这里我们便从理论角度建立一套解决线性方程组的体系. 线性方程组: 形如下面形式的方程组称为线性方程组. 回想起解决二元线性 ...

  9. poj3708:函数式化简+高精度进制转换+同余方程组

    题目大意 给定一个函数 找出满足条件   等于 k 的最小的x m,k,d已知 其中 m,k 很大需要使用高精度存储 思路: 对 函数f(m)进行化简 ,令t=ceil( log(d,m) ) 可以得 ...

随机推荐

  1. ASP中Utf-8与Gb2312编码转换乱码问题的解决方法 页面编码声明

    ASP程序在同一个站点中,如果有UTF-8编码的程序,又有GB2312编码的程序时,在浏览UTF-8编码的页面后,再浏览当前网站GB2312的页面,GB2312编码的页面就会出现乱码 出现这样的问题是 ...

  2. Android Studio打包签名全过程

    Step1:Build-----Generate Step2:签名文件保存位置,习惯性的保存在项目的根目录下E:\Users\StudioProject\SmartHust\smarthust.jks ...

  3. [CSS] Transforms

    Degrees and Turns Degrees are just one value that can be set to a rotate transform to determine how ...

  4. [Oracle] Data Pump 详细使用教程(5)- 命令交互模式

    [Oracle] Data Pump 详细使用教程(1)- 总览 [Oracle] Data Pump 详细使用教程(2)- 总览 [Oracle] Data Pump 详细使用教程(3)- 总览 [ ...

  5. [转] 在React Native中使用ART

    http://bbs.reactnative.cn/topic/306/%E5%9C%A8react-native%E4%B8%AD%E4%BD%BF%E7%94%A8art 前半个月捣腾了一下Rea ...

  6. R cannot be resolved to a variable

    1. 检查Android 的SDK是否丢失需要重新下载,检查build path,把需要导入的JAR包确认都导入成功 2. 确保class没有import Android.R,注意是不能有Androi ...

  7. HTML5 文件域+FileReader 分段读取文件并上传(七)-WebSocket

    一.单文件上传实例 HTML: <div class="container"> <div class="panel panel-default" ...

  8. CTE-递归[2]

    在此之前写过一个CTE的递归,取出了所有的子节点,基本上可以满足大多数的需求,这里我们来延伸一下:首先我们回顾下原来的场景 图片的上半部分递归查出某个节点的所有子节点,这个我们已经通过CTE实现了,可 ...

  9. 解决kernel headers报错

    Make sure you have updated version $ sudo apt-get update Search for kernel version (optional) $ apt- ...

  10. Linux下使用NMON监控、分析系统性能 -转载

    原帖地址:http://blog.itpub.net/23135684/viewspace-626439/ 谢谢原帖大人 一.下载nmon. 根据CPU的类型选择下载相应的版本:http://nmon ...