编程之美 中国象棋将帅问题 的再进一步讨论

原创 2011年01月13日 00:11:00

今天开始翻看编程之美,书真的很不错,

比如问题1.2 中国象棋将帅问题,初看似乎很简单,但是只需使用一个变量的设定,顿时让此题熠熠生辉,

对有挑战心的程序员来说,立刻从成都小吃变成了俏江南,呵呵

 

首先不自量力的简评一下解法1和解法3,

解法1过于繁琐,好吧我承认对于解法1我压根就没有仔细看,因为我深信有更简单的解法,

解法3则有点邪道攻略的意思了,能用struct的,那我还用class呢!当然域限定符的使用有点意思的。

 

和书中提供的薛笛同学的blog所见略同,最高的无疑是解法2,真正的重剑无锋大巧不工,简单而复杂,复杂而简单!

原文见:http://blog.csdn.net/kabini/archive/2008/04/07/2256421.aspx

 

在此篇blog中,薛笛同学对此解法做了深入的阐述和分析,并进一步分析出了3重循环公式、4重循环公式,

最后指出了“N重循环原理也是一样”。

 

不过对于循环展开公式部分的推导,个人觉得实际上并不需要一重一重的去分析,任意重循环的展开公式是可以递归实现的,

可以用递归来无限展开。本文的目的就是分析探讨N重循环展开的算法实现。

 


 

首先,我们归纳总结一下展开原理,

对于 a*b = i ,我们可以用如下公式展开


    loop1=i%b;
    loop2=(i/b)%a 

 

其中loop1是内层循环,loop2是外层循环

 

 

那么如果 a 本身就是 k*j 组成的呢?

由于 k*j = i/b  ,套用公式得到

   

    loop1= (i/b)%j

    loop2= ((i/b)/j)%k 

 

由此可以得出N重时的公式,假设 an * a(n-1) * ....... * a3 * a2 * a1 =  N

 

    loop1=N%a1

    loop2=(N/(a1))%a2

    loop3=(N/(a1a2))%a3

    .....

    loopN=(N/(a1.....an))%an

 

则对于给定的 an * a(n-1) * ....... * a3 * a2 * a1 =  N ,展开式是 ( Nzk 意思是N的展开 )

Nzk =  (N/(a1.....an))%an +  " ,  "+  .....  (N/(a1a2))%a3 + " , " +  (N/(a1))%a2 + " , " +  N%a1

 

得出

Nzk  =  ((N/(a1.....an))%an +  " ,  "+  .....  (N/(a1a2))%a3 + " , " +  (N/(a1))%a2 )+ " , " +  N%a1

 

得出

Nzk =   (an * a(n-1) * ....... * a3 * a2)zk    +  " , " +  N%a1

 

得出

Nzk =  (N/a1)zk  +  " , " +  N%a1

 

 

至此得出了递归公式,

N的展开式 = (N/(N的最后一个因数)) 的展开式 +  ( N 模(N的最后一个因数))

 


 

既然有了递归公式,那么实现算法就相当简单了吧

我用java实现的代码如下:

  

 

 

使用薛笛同学的数据测试一下

也就是上述代码中的

  li.add(2);
  li.add(3);
  li.add(4);
  li.add(5);

得出结果

 

完全正确 ^_^

 

 

 

 

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

《编程之美》读书笔记(一):中国象棋将帅问题

《编程之美》读书笔记(一):中国象棋将帅问题    作者:薛笛   EMail:jxuedi#gmail.com    千呼万唤始出来,在跳票了快一个月之后,虽然明知道书里还有不少错误没改过来(附了一...
  • kabini
  • kabini
  • 2008-04-07 11:13
  • 11788

《编程之美-读书笔记》-1 中国象棋将帅问题

题目要求——象棋棋盘上以A代表将,B代表帅,将帅不能相对,请输出所有合理的位置。A,B均可以以数字1到9的九宫格来显示。另外要求,只能用一个变量。  A ——         1 2 3 ...

《编程之美》学习笔记——中国象棋将帅问题

应该说这是一个很简单的问题,但是想巧妙解答还是得费点周折,以下是原书提供的三种方法: ======================================================...

【编程之美】中国象棋将帅问题

问题描述在中国象棋里将和帅是不能碰面的,如下图所示,当将位于d10时,帅就不能在d1,、d2、d3。请写一个程序,输出将、帅所有的合法位置。要求在代码中仅用一个变量。 如果只是输出将、帅的合法位置,...

)《编程之美》读书笔记(一):中国象棋将帅问题

千呼万唤始出来,在跳票了快一个月之后,虽然明知道书里还有不少错误没改过来(附了一整页的勘误),但是感觉已经不能等下一版了。赶快去书店买回来,吃完饭躺床上舒舒服服地看。大致翻看之后,总体感觉是书中的内容...

编程之美1.2中国象棋将帅问题——转载+自己的一点理解

分享这个链接:http://book.douban.com/annotation/13753057/ 引子问题:中国象棋将帅问题: 在一把象棋的残局中,象棋双方的将帅不可以相见,即不可以...

编程之美读书笔记1.2——中国象棋将帅问题

问题:题目:下过中国象棋的朋友都知道,双方的“将”和“帅”相隔遥远,并且它们不能照面。在象棋残局中,许多高手能利用这一规则走出精妙的杀招。假设棋盘上只有“将”和“帅”二子(如图1-3所示)(为了下面叙...

编程之美:中国象棋将帅问题

题目大意: 设A表示“将”,B表示“帅”,AB均只能在各自的九宫格内移动,但是他们不能遥相对望,输出所有A、B的合法位置。要求只能使用一个变量。 分析:设九宫格如下: 1 2 3 4 5 6 7 8 ...

《编程之美》1.2 中国象棋将帅问题 学习笔记

《编程之美》1.2 中国象棋将帅问题 学习笔记 书中给出了三种解法分别进行知识点整理

编程之美 1.2 中国象棋将帅问题

中国象棋将帅问题 问题描述: 在中国象棋规则中,将和帅规定只能在田字格中移动,且将和帅是不能碰面的, 请求解出所有可能的符合规则的将帅位置。 限制条件: 只能使用一个字节的变量 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)