九连环的递归算法(C和C++)

上一篇 / 下一篇  2012-08-24 09:32:13 / 个人分类:C++

51Testing软件测试网"M#huEq&h7hoj K

  一、九连环简介

1n8b|8ajeo;^-?4T0

L|/K r]v?;w0  九连环游戏是中国人自己发明的,它的历史非常悠久,据说是起源于战国时期。九连环主要是由一个框架和九个圆环组成:每个圆环上连有一个直杆,而这个直杆则在后面一个圆环内穿过,九个直杆的另一端用一块木板或圆环相对固定。

,oYDjZE]\051Testing软件测试网4J&pX8tv$kp/\Oe

  二、九连环的规律51Testing软件测试网vO N*H(c#v

/Oc0L/R2Z~0  通过玩九连环你就会发现存在这样一个规律:51Testing软件测试网Iv G(P3wxTM

51Testing软件测试网!I3` ^m)AO;C!yHQ;?,i

  (1)第 1环可以自由上下51Testing软件测试网,Aer]j

51Testing软件测试网$R*_v3?"{ n3B

  (2)而上/下第 n环时(n>1),则必须满足:51Testing软件测试网4ot|5z)?Er3f

51Testing软件测试网F6HQ2pT;J rGg

    (a)第 n-1个环在架上51Testing软件测试网/Cx1Hw;I:su!Bn@

g!A] ^szt0    (b)前 n-2个环全部在架下

g%K,v.iG0EdV051Testing软件测试网(b Th.b5t*^ G1U6q?

  三、拆解/安装的过程

)uj Uyc-Fs2D1od*l051Testing软件测试网6Z:G5|ruWj4o

  正确的拆解是先以第 9环为目标,先拆下它,简化为拆一个 8连环。接着再也第 8 环为目标,拆下它,简化为拆一个 7连环。以此类推,直至全部拆解。

0d4] opn5D051Testing软件测试网%{4[k&D:gK3U)Q WF

  其实安装和拆解是一个道理,因为他们均是使用上面说的规律来完成的。51Testing软件测试网Th)c wem"y

51Testing软件测试网5h|-dOW

  正确是安装也是先以第 9环为目标,先装上它,简化为装一个 8连环。接着再也第 8 环为目标,装上它,简化为装一个 7连环。以此类推,直至全部安装。

q*j c F5d9vF!m051Testing软件测试网B+`6X$teQ+|

  当然,现在这么说是便于理解,当你深刻的理解了上面所说的规律后,就会发现,安装上第 9环后,问题可以被简化为装一个 7连环,而当装上第 7 环后,问题就被简化为装一个 5连环了,呵呵,就是这样的,不知道你现在是否明白我的意思……

:o3it'H8l%pO$\051Testing软件测试网8j{x/s4AP~cu

  四、一个猜想

0w]gpsu9@0

*x A/C#g;~p!u0   仔细观察九连环的结构、思考九连环的规律及拆解/安装的过程,你是不是有一种感觉:九连环跟递归一定有联系。你看,递归的基本思想是把一个大的问题分解 为一个规模较小的问题,从这些较小问题的解,构造出大问题的解,而这些规模较小的问题,用同样的方法分解成更小的问题,从更小问题的解,构造出较小的问 题,一层层下去,一般最后总是可以分解到可以直接求解的小问题。嘿嘿,九连环的拆解/安装多么的符合这个规律啊……^_^

V0Rz;nl(tV Z*w,H R~(C051Testing软件测试网g ]-f^_w%z

  五、算法实现51Testing软件测试网]CI:}8p F

(BN4zW+i,Ze4VL0  以下是算法实现,程序写的很简洁,省略了很多功能的实现,比如计数等,如果你觉得有必要的话,可以自行添加上去,我相信很容易,并不要很多的改动。

I7m+e5ol:I&l3`051Testing软件测试网9~S'kf:N$n

  The C Code Here:51Testing软件测试网A u'f,c2C mM8Au#G

/j i e w*|x-h+W0/****************************/
0N {Z,gX0          
任意N连环均适用

etbu+~ua,P0          
日期:2002/11/651Testing软件测试网o(| Q"{ c)x"r
          
程序设计:道可道

AJ,r9n fC0          
腾讯QQ390800051Testing软件测试网 UG7Wo/z},A
           
电邮:
Havelife@mail.csdn.net 
'K'X`;l5o0Q"A-Hl0/****************************/

l8qUg9{i051Testing软件测试网q%@,W5q,t%b:b/?8F^ B0t

void UpRing(int n);         /*函数声明*/

+Byc q#iLFFc8]051Testing软件测试网 u+M5X.b^H)N

void DownRing(int  n)     /*下环逻辑*/
qQ/lo ybX/mH0{51Testing软件测试网_;p;V2h_!E
    if(n>2) DownRing(n-2);
MPSTj5`:Y,W,^kv0    printf("
下第%d
\n",n);
#Op(bhSk~0    if(n>2) UpRing(n-2);
#u1J1QZ-Dxd!T0    if(n>1) DownRing(n-1);
[ F#? |/OgqC$E0}
51Testing软件测试网f}8e,Y2b7?'S1l]sJ

51Testing软件测试网eD.P.`)tl+Z

void UpRing(int  n)         /*上环逻辑*/51Testing软件测试网Ae?/WU+bR
{51Testing软件测试网y5A4A/H&Sm V
    if(n>1) UpRing(n-1);
L {6[7W'x*o0    if(n>2) DownRing(n-2);
+tF XveqGN0    printf("
上第%d
\n",n);
]8`_;C2hC0    if(n>2) UpRing(n-2);51Testing软件测试网)_*[3O-x.OF2? ]u
}
51Testing软件测试网Y)R,d5tf

~Q:s9zK,Y9W8q@({j0void main()                51Testing软件测试网 ]uU'C!s8a-u6@

"mC}N2]!N3K1I|%cM0{

]aPFf;@051Testing软件测试网 ZEtW"l-|8s-`&E

    printf("拆解\n");51Testing软件测试网3T_'K6o x
    DownRing(9);
:a9A0}8EFj {*c#L0    printf("
安装
\n");
.n#YJ e3O.N*z&J-r0    UpRing(9);51Testing软件测试网 X|%`6?X ygtL)s#I
    printf("
结束
\n");51Testing软件测试网2{%[UJ5j5rKCM
}

pLd7ID%{3Bw0
51Testing软件测试网#}Iqo;aV#EP
51Testing软件测试网/StP;R-xJW2dn

The C++ Code Here:

Y Z'Y?{\j-B:N0

+qy!r.T4\v0/****************************/
SiC$f?w M0           任意 N连环均适用
51Testing软件测试网+u7PTNE*{

!J[+byYN0           日期:2012/8/1251Testing软件测试网b(V0gL0g^

51Testing软件测试网g#J!DqH8a!Qi

           程序设计:YCY
K!D |-p [;al`(r0           电邮:ycy360@163.com

%}&P t b-[Trrh0

h+qppDU8r%iT0/****************************/51Testing软件测试网0h xR*A@ a$L

51Testing软件测试网HvOtT$R

 

In _I w`:N4F ~4ef0

+@(_3y&Inl { Vf0#include<iostream>51Testing软件测试网7J%Q1c-H8z

Hf0RB/S4k0using namespace std;51Testing软件测试网t)M{+n+E.o p J5{

51Testing软件测试网&l+c"N4CHl.L4A)b9z

 51Testing软件测试网 H3_2U {8D R[

51Testing软件测试网QkqU5iq_XB(qg

class Ring

0Z:ovls051Testing软件测试网M#t0\t3HB'o n

{

ISjyS8pP051Testing软件测试网C%s HqU&K

public:

!y ` a,V;@ {n+u0

E3e7AR|7m8u,|0       Ring(int n):nRingNum(n){}51Testing软件测试网+X x0} RNKW*P

51Testing软件测试网K V5b.Q_0j,V}Z+Wi

       void UpRing(int n);51Testing软件测试网&a:e,z'Vk;D

\U4`a1V?0       void DownRing(int n);

%Cox8N I0

N a6?A q*z`[R0       void startDownRing();

B2BmiMQhMPft0

(QG+^7E4F2]0~0       void startUpRing();51Testing软件测试网~/B:b,y{)LB$H6O3wK

+kI2DYiVA0       void totalCnt();51Testing软件测试网G6\K:\+hwx

51Testing软件测试网^:QbQ/n

       void setUpZero();

`.VSIC d Z0

zUjh o8pTa P0private:51Testing软件测试网,b9Q s3{8g QH

51Testing软件测试网 F^%|%YrRT

       int nRingNum;51Testing软件测试网q+AQT;_1eF|)X

51Testing软件测试网 |@!q)Q+^4}h

       static int s_nCnt;

E5S%ydV${051Testing软件测试网^v:LP4E0\

};

dG,D+C V,Q0

#@nXSK"~a\ f0 

'H'W0x7_L'ce0

+i1KYBA@g(v0int Ring::s_nCnt = 0;    //计数51Testing软件测试网Z2p.u0b@ B$V

i-F!~%[n| k0void Ring::UpRing(int n)  //Upring是DownRing的逆过程.51Testing软件测试网]y5z.A;qX&L'}

51Testing软件测试网2Fi}zq T

{

;If:nLRgy$PN0

,cxQ8L |1A8S)z*m0       ++s_nCnt;

k{-\y1aD)m0I051Testing软件测试网#Us7ja_#i.h;W

       if(n>1) UpRing(n-1);

,ZE3{bMbp e0

1Sl,[%yM^ ir,[8Z0       if(n>2) DownRing(n-2);51Testing软件测试网7qt|5`6K:N'FtW

51Testing软件测试网\1Ar)O/O$i

       cout << "上第" << n << "环" << endl;51Testing软件测试网9D#s$X.MJ_;g i4Q.K

51Testing软件测试网F+?Psu

       if(n>2) UpRing(n-2);51Testing软件测试网wfZ7H$o@Jt3x

'|\X ^"I,@!e0}

1OD,E)P2nV)P6sZ,K0

;R:T(Y@5Q C7?0 

"Nq MP/h*mN051Testing软件测试网pAy U B9K9HX

void Ring::DownRing(int n)51Testing软件测试网]6]4RC*_k M&{

51Testing软件测试网 d9lY`+dJ~

{51Testing软件测试网[iIm5V*WQ

{,td1} E0M0       ++s_nCnt;51Testing软件测试网Tc%XKK&cHr(Vt:E

51Testing软件测试网ixU2b@q+}5b

       if(n>2) DownRing(n-2);51Testing软件测试网_(KoI n I{0u

51Testing软件测试网/E.^UXF~v OU

       cout <<"下第" << n << "环" << endl;51Testing软件测试网?G#EhG

51Testing软件测试网 uIq NIg.V

       if(n>2) UpRing(n-2);

$lg` X l$^S051Testing软件测试网 k MD&{6|N _,s

       if(n>1) DownRing(n-1);

]0Vu,N%V/~(G z0k"X0

F\2Z)NYgsv?:z0}

l%CDD(?6p#o} x0l0

+Vk v(@WX @0 

;qf z#]9N&[h^i0

u[ O ?J0void Ring::startDownRing()51Testing软件测试网N#z1SYaq

C {1gNrc(wCf0{51Testing软件测试网`U V J9a

51Testing软件测试网]d fC2M0l8x

       cout << "拆解" << nRingNum << "连环操作!" << endl;

r}0nG{d051Testing软件测试网iC m@8~cd

       DownRing(nRingNum);

7yltw)`0

W9C,_{r{UM0       cout << "拆解完毕" << endl;

h:R"ml}4v051Testing软件测试网 kohs&QrHk

}

1TG2Tg9S+wfV&H0

x2xHx4b'}w9[0 

U;j"I'?9H:x9X9c.C051Testing软件测试网e ptj.`5G

void Ring::startUpRing()51Testing软件测试网'G.e6q^ZK.G"h#i

51Testing软件测试网$~ h:b ~5z%~j[

{

4Q/W~R0U0

!A^vE;q,c*d j0       cout << "安装" << nRingNum << "连环操作!" << endl;51Testing软件测试网V ZgFB0sd

51Testing软件测试网t/Q%u(U,e/}ue_

       UpRing(nRingNum);

Ifw]}2P0

"Q DQd$Yw0       cout << "安装完毕" << endl;

l~ O9t8H051Testing软件测试网s1Y k.db S} @}NE\ y c

}

FKvyt:W0

5up:Lq!i1Zt,U c/m0 

JB x wr| O+d1b7w0

K/o@ o3s*_0void Ring::totalCnt()

's @*P'{4NZ _3lXN051Testing软件测试网1x(Zcb+Kp;~ZHe

{51Testing软件测试网 ?8eE!T%cZZ

51Testing软件测试网|N!nN)F\u1M&T8w

       cout << "共累计上、下环" << s_nCnt << "次!" << endl << endl;

DXrgBK0

H1Ix(L/Y0}

n5tO u,`W0

D)PR|!l&}0 51Testing软件测试网_#C&?Z'm&_6jBD8\

vR'b [(_*iY0void Ring::setUpZero()

E1w|.A.]1Q)x R0

#GLrb5_OD'F.N^!`0{51Testing软件测试网vy-G9_[4c

51Testing软件测试网 fz{7Tr9@l~B

       Ring::s_nCnt = 0;51Testing软件测试网fQ I6h+L cb l%na+j[

51Testing软件测试网{@e'H;UY tG

}51Testing软件测试网#d+i$YV+x\*I

51Testing软件测试网3^ ME&r1Rb!j@b

 51Testing软件测试网8R'_$l%c4F.^^

51Testing软件测试网:WV4t3K f*d

int main()                 

.]uA5{*l:Jr6? D!I051Testing软件测试网\.dBt rb lV

{51Testing软件测试网BJ ?m'g#\y5U

51Testing软件测试网U xm W5h&tM!l

       Ring ring(3);51Testing软件测试网 }7l I;m#BGo

_fU \+L#] aJ0       ring.startDownRing();51Testing软件测试网/z'r ` F` Ica^

51Testing软件测试网|Y ]@0E5?#V

       ring.totalCnt();51Testing软件测试网 ^W/\*VQ%e5P

YFAd*Ceo0       ring.setUpZero();      //置为0

\FC*xo*A!L7\051Testing软件测试网%l`5xj4IU

 51Testing软件测试网~(t#J-U+h]

51Testing软件测试网Y;Fd i,ee+Z

       ring.startUpRing();

QTRs)i]0

T2E:z"wf4s0       ring.totalCnt();

:ir(}3Ec0

*g5}5d Gev U DW ?0       ring.setUpZero();

FF,Y8jJy5O#m!J051Testing软件测试网,E${:w ep;Jh+A

      51Testing软件测试网;zi3eE2g:K[X

c8Ag-R7fW0       return 0;51Testing软件测试网7C']X"U$N |*mc

y2@ k_mxh4}6r2QT0}51Testing软件测试网*hrB;H%z%}3DR]

51Testing软件测试网 Os+\9\c#UL}z

  存在以下序列即:51Testing软件测试网!W'o!hYsL r

hAz*A w] B0

Z1w f!P1pFx3pD0N(numOfRing)

$pY8Q-jfo9h.b0

1

|f9E!uZ5B@0

251Testing软件测试网p c3R z%`q

351Testing软件测试网 O)kvC-s8G0q

451Testing软件测试网R;YY'FD y yZ}

551Testing软件测试网2vB]i&v*P

651Testing软件测试网q8eh? ] R I

751Testing软件测试网.Ev3~`f8A(`_

8

7J5L|Q FrA0

9

&_T3\Oci2xT0

1051Testing软件测试网.okMWY+\m u

11

?ji0A6c4|P [}0

$|V(L5pGQ7b!yg0

a/pZ D Z3S9y2U]0 Cnts

"Cp0S}Dw0

1

Ds(nH-@W;{?0

251Testing软件测试网1XUZ'@ `T;g ^

5

F"pjOW%`H:X0

1051Testing软件测试网lZHo Kd g

21

-wZ I.u!iH,}0

42

x+i;_0Rz%G6p0

8551Testing软件测试网$x`$`8Z%n

170

Hj ]&}!PW-E.Vh0

34151Testing软件测试网3_ i|[%BQ}

682

^mRHv'M!RJLF/gh0

1365

N:J%?&gWN0

….

v(Q_+j5U0

  呈现阶层递增的趋势。

w/y i(Oy H2CW8x0

TAG:

 

评分:0

我来说两句

Open Toolbar