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

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

N1{%[ g"pIV\&N0  一、九连环简介51Testing软件测试网y-J-zs(M

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

.gk*h5k K e,s1}051Testing软件测试网$_p.p?:H i*R/f

  二、九连环的规律51Testing软件测试网 Mq-KV? @"T

51Testing软件测试网 | Y Lb'Yo!S

  通过玩九连环你就会发现存在这样一个规律:51Testing软件测试网7A~7A7N@WC

51Testing软件测试网N.{+q5k;Su/w

  (1)第 1环可以自由上下

6u z'{7UcI-O"~?0

{-}f&KAM_JI0  (2)而上/下第 n环时(n>1),则必须满足:51Testing软件测试网}(G)O4k`7m(R\H

cN^.E:\bu0    (a)第 n-1个环在架上

,fzsr!mf(FQN.r0

j\5^m:h"A5p0    (b)前 n-2个环全部在架下

RK9vy8HT0

]7P#n-q[ ^u)r~0  三、拆解/安装的过程51Testing软件测试网lM2?JWGK+s

\6a+ak3C0UA T0  正确的拆解是先以第 9环为目标,先拆下它,简化为拆一个 8连环。接着再也第 8 环为目标,拆下它,简化为拆一个 7连环。以此类推,直至全部拆解。51Testing软件测试网P&M4J;A;N3a"}8JH

ke x,M%F,?0  其实安装和拆解是一个道理,因为他们均是使用上面说的规律来完成的。

#l,V'PmwC6k;Gt0

@AN)N8s"Hi$YP8w s.K0  正确是安装也是先以第 9环为目标,先装上它,简化为装一个 8连环。接着再也第 8 环为目标,装上它,简化为装一个 7连环。以此类推,直至全部安装。

2S"x"AHJ(V"g0

/V8fn O:yo'}0  当然,现在这么说是便于理解,当你深刻的理解了上面所说的规律后,就会发现,安装上第 9环后,问题可以被简化为装一个 7连环,而当装上第 7 环后,问题就被简化为装一个 5连环了,呵呵,就是这样的,不知道你现在是否明白我的意思……51Testing软件测试网sl%i!{M7u

51Testing软件测试网3I `bt"{6f W,M

  四、一个猜想51Testing软件测试网S*G-R9D{)Py@

51Testing软件测试网E AL ap

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

3GI,RXN1LL5p051Testing软件测试网`[y_-Z+z|1Q

  五、算法实现51Testing软件测试网a5g~0e+I4xh6y-l

51Testing软件测试网G'Pl+T|

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

jR\^~051Testing软件测试网f T ia'^

  The C Code Here:51Testing软件测试网KlVT9O)Cvm&n

51Testing软件测试网t"}{aG+N/\

/****************************/
*?fn ~a0          
任意N连环均适用

8JjT-@l,A*I0          
日期:2002/11/651Testing软件测试网M~'y"PS#D
          
程序设计:道可道

*lS9v*[.x0          
腾讯QQ390800051Testing软件测试网1D2k$XY#v0p
           
电邮:
Havelife@mail.csdn.net 51Testing软件测试网Ys|'vVF O[{
/****************************/

+O5kJiD H6]|051Testing软件测试网Z;V;wD&qk

void UpRing(int n);         /*函数声明*/51Testing软件测试网R|J-o f~0Z"F*B

/]lkBn/?`!e0void DownRing(int  n)     /*下环逻辑*/
G6g ag Cg D y0{51Testing软件测试网^$l6C3u_] ?A
    if(n>2) DownRing(n-2);51Testing软件测试网S1T@2t%PQ lTd
    printf("
下第%d
\n",n);
8CA5e\S`E0    if(n>2) UpRing(n-2);51Testing软件测试网Y S U)a&R G%b7z
    if(n>1) DownRing(n-1);
1C#V3e\'G2I0}

ENr7L3D.ej;v8B2l.@7L051Testing软件测试网,EdGga5v

void UpRing(int  n)         /*上环逻辑*/51Testing软件测试网&z*?4~&k)WxW'B
{
iA5rJ+@ c?4Y7z!]+|H0    if(n>1) UpRing(n-1);
0]3kW9A Ew0    if(n>2) DownRing(n-2);51Testing软件测试网AG/AE ?GCq
    printf("
上第%d
\n",n);51Testing软件测试网X g1Fq1F/N~
    if(n>2) UpRing(n-2);51Testing软件测试网 @7yf.I2r K:O)d
}

3~1h!j7M U051Testing软件测试网7J e.w|2u1W

void main()                

;il`F%g0

v]:[CEH0{

.q kJ5Y+{Ik/E$P9c0

/M bB"i8ct AK0    printf("拆解\n");51Testing软件测试网0RK v6y/M&K
    DownRing(9);51Testing软件测试网]Z3b P8x
    printf("
安装
\n");
C?/i:tyE6uU0    UpRing(9);51Testing软件测试网*GX HXpM*NR*B{1f$M
    printf("
结束
\n");
q"n G!s4UD'Rk\8Z0}

Z?ci2d/s1[0

mWB9[ ptQ2X;F0

M ax5Djbf'i0The C++ Code Here:51Testing软件测试网9pvi$cV"Dg

,lY9NIp#?d0/****************************/51Testing软件测试网1c2]ik H `&XO
           任意 N连环均适用

&jH%] n"C#x0

T d'{9E4CAp:H0           日期:2012/8/1251Testing软件测试网.@(?"M$Z*W6j:Gk

:OwQ.A e&c0           程序设计:YCY
,QY VN5xzr@0           电邮:ycy360@163.com
51Testing软件测试网i6R4u[)pG6f-L

@XOn,L$WW$L0/****************************/

}i/OU\UF D051Testing软件测试网:D0E$zo8p"c

 

Pit[U!N0

*~"Q#?t(n_E0#include<iostream>

)Khk7I&D,`+v0

TdzkH"SK0using namespace std;

v'IX E"d.^,H;O+yC051Testing软件测试网 Y h-u#Zreuec

 51Testing软件测试网 b)S f4hj(o8ws{

51Testing软件测试网]'W9_6]K\-s0x~iv D b

class Ring

%xnEtz:H0

x;V'K0M v7t7Ic0{51Testing软件测试网 e g Xv*mWD"`ecF

51Testing软件测试网 tF? YuD

public:

*Ne e T3_051Testing软件测试网'P$[,o:d ^_;D#v

       Ring(int n):nRingNum(n){}

'nDsJkS4B051Testing软件测试网k~9p^L%pDe"c

       void UpRing(int n);51Testing软件测试网J'_ v M m5Nz/O

g ~.R"i j*i ~@T0       void DownRing(int n);51Testing软件测试网L U!g/j$~ MA

R0VOf#?q/Z0       void startDownRing();51Testing软件测试网~oY*P|1X

51Testing软件测试网 Zq1Zt2m{

       void startUpRing();

I)f"^c4M5s(M{0

5`5Z\h,J0\ zz0       void totalCnt();51Testing软件测试网Kb s*x5ht

51Testing软件测试网q]bq:ZJ

       void setUpZero();51Testing软件测试网*IC Wk7{glhfT

51Testing软件测试网va;vTz"[!C.l-i

private:

~A5@KQ;Af2\z0

AD,z7M&v0       int nRingNum;

S9b2^ pv9f&~2e7Q t051Testing软件测试网*hRcum v4h'\"P

       static int s_nCnt;

{q(G)` C5R)o0

jP-H4e SI:u0};

*M'Hx5l-S_0

)@ [M(g?^ A4M.BB G |U0 51Testing软件测试网-rFU\y;Wr J

51Testing软件测试网FU6pJQBBl.[a

int Ring::s_nCnt = 0;    //计数51Testing软件测试网n n{bxC5J

51Testing软件测试网:`7h9k7V"?6HX Hr

void Ring::UpRing(int n)  //Upring是DownRing的逆过程.51Testing软件测试网H*iaH1o%}#b LkNXc

f4K(Db f0{

$@ m_q N2Ilg3j iA ?0

zyb#s"f y0       ++s_nCnt;51Testing软件测试网jk ylJ

}sNVkO8],?0       if(n>1) UpRing(n-1);51Testing软件测试网4n u0G%Pc.p4G)Q

NnZuv$V$b0       if(n>2) DownRing(n-2);

6TM!l8O$lKLb051Testing软件测试网4DSZ v"ix0vw

       cout << "上第" << n << "环" << endl;51Testing软件测试网1x e(_uk0r,Byh

51Testing软件测试网2w9yJ)B+Xc3H

       if(n>2) UpRing(n-2);51Testing软件测试网9J9h6mRl*OB:|)~

,la q @(b/|u ~0}51Testing软件测试网MH1z.mr|Z:r

51Testing软件测试网!j2z-Sk5w$BT6h

 51Testing软件测试网{D{z0dM7I

|a8e6yev^_&G)`0void Ring::DownRing(int n)51Testing软件测试网,F`sG2C/O#PU/x

Z*d$n8Y.?a:j6L0{51Testing软件测试网C,~rX~_

(UP\8p,I|X0       ++s_nCnt;51Testing软件测试网"g%i!B#nW'sNk

51Testing软件测试网*v0~Ra+eyp!hx

       if(n>2) DownRing(n-2);51Testing软件测试网EZ#h:V7v

{4Ig8n6J[8B o8r0       cout <<"下第" << n << "环" << endl;

2Un-Tg/CsN%^1N1H0

6r|yO?#Q7sw0       if(n>2) UpRing(n-2);

R d;cjs{2u051Testing软件测试网C$A0XKN3r

       if(n>1) DownRing(n-1);51Testing软件测试网`!Y*ZFyn

51Testing软件测试网)\)Z/J]] w/i1V

}51Testing软件测试网"b!wB9|f } E

n3N*to"xl%{0 

H"jqD6M5OX)c051Testing软件测试网f;B0W+LTsG4G t S!J

void Ring::startDownRing()

A9w1K-Hlf*mw051Testing软件测试网0Z%T#H{ R2] _t(T]5\

{

3Ui#N-U:t0F.i"u['^051Testing软件测试网z|$YjEG_ t5G

       cout << "拆解" << nRingNum << "连环操作!" << endl;51Testing软件测试网1KCijj} Icd

51Testing软件测试网+D A2\sV{

       DownRing(nRingNum);

1zs(\Or L3GY051Testing软件测试网EMU U-B

       cout << "拆解完毕" << endl;51Testing软件测试网h9d^;DZ:NN-~4W

51Testing软件测试网;@5\ T]Q%|/rO2y"_;o

}51Testing软件测试网"^z0_0\xx9R

{tk8P o }:I0 51Testing软件测试网]1Q[jVIg,G

51Testing软件测试网6k~0r+W9`

void Ring::startUpRing()51Testing软件测试网{E.Z!Q*`5c @.d

51Testing软件测试网!MQ img%}9Q+N

{

u.H\eT#`(E)u3@051Testing软件测试网1i H fl{+a'F

       cout << "安装" << nRingNum << "连环操作!" << endl;51Testing软件测试网Yu#s/x }&VL"y&j g

/JG+Z#\A/TC&of0       UpRing(nRingNum);51Testing软件测试网7y#T,@L {:]5J4a3d

51Testing软件测试网8NF5l#e1h2v!Gr'U

       cout << "安装完毕" << endl;

%m+{%x0R"m*I(N$~8J"cJ051Testing软件测试网9H#u9z*y$d8sAn

}

J2ZI u\q0fS'cVw0

Y'm'h-yPC$S0 

$k*q/q/C^0

[8k jcW2jd0void Ring::totalCnt()51Testing软件测试网]$}DrSe)_u;Kiq

J Qc3~B*p0{

4^I4ZD&Q Jew(_#X"a0

8rc _?Z&HW%p0       cout << "共累计上、下环" << s_nCnt << "次!" << endl << endl;

A.nxC%d@-q051Testing软件测试网i0S-^-qhz8B0s"r

}51Testing软件测试网 mz3s?7y g

51Testing软件测试网X3X:N g s

 

&Fj~#^`F'd,[1}051Testing软件测试网\2M-u!?EYh9J N

void Ring::setUpZero()51Testing软件测试网 lN1d&~8z

51Testing软件测试网&P.JF6OSrQZ4V

{51Testing软件测试网 T1y+PF+M'B

51Testing软件测试网3W| A W\|*r-`[

       Ring::s_nCnt = 0;51Testing软件测试网-P)X:g!xbtl

51Testing软件测试网'z@!N_yq;r?I

}51Testing软件测试网6WI'j LS7Y w4{

^c/ME7B8_ wG]*mU0 51Testing软件测试网6W_%y1^p F'{#h0ZB

? e*g*Tk,F2vY0int main()                 

/V+jreu-c051Testing软件测试网3O} D3`O-g'CdSu

{51Testing软件测试网7E4{2hS4p%F0`a_`,_

51Testing软件测试网gui7z3dY'B

       Ring ring(3);

%p&bK0p+_&q0

2DZ q*|Ev0       ring.startDownRing();

w ^7|`N*u:Z0

.[5}?){UX{JLE0       ring.totalCnt();

.MVB0w{1Jf1R4w0

&G0ZG-m/F[0       ring.setUpZero();      //置为0

VWOQ.w(pn051Testing软件测试网B V\ k1q*h

 51Testing软件测试网3s4JXm C.j }

0d"v8U?\r(p0       ring.startUpRing();

\A k:QzWgD051Testing软件测试网ThO6?)[a

       ring.totalCnt();51Testing软件测试网\'g9IH&O QOE

+Y E {o.JsB QY+M0       ring.setUpZero();

YY2y8]} `051Testing软件测试网rCevg8YTb

      

W;m@ OtAi0

I z5Nd(R'kD(^ {6M0       return 0;51Testing软件测试网W-kMH1?"pK6C ]

51Testing软件测试网?;|j.w8D^

}51Testing软件测试网 wp@5z#fV'h fl

51Testing软件测试网:c%c0U~4A}&J

  存在以下序列即:51Testing软件测试网I2^sn&Ug

51Testing软件测试网a0Z"nb Rk[#u

51Testing软件测试网[a+}%K \q?}+J

N(numOfRing)

}x,u#tq[k}l$_0

151Testing软件测试网}"TP+Y)|FFN

2

9H c.RC o `4V0

351Testing软件测试网 U#v UhJy1^g

451Testing软件测试网`&f8g)]4_

5

2h0d9p KA{K0

651Testing软件测试网!\;x+j;ISmq\

7

C6L6]bek ?0

851Testing软件测试网?t1w+V$r+_J

9

/nhk3G x4lf0

1051Testing软件测试网}+y'Y7i)Y ?Q'G5q

1151Testing软件测试网)X)g$xyF%u

'ev@^TQ AX'Z;e)J0

3k2{T|#Yb.Ax2k7c0 Cnts51Testing软件测试网&k/C.PB3Qw4Ll

1

!X Uh&h,^ j0

2

0xS&ue8K1L^ ?0

5

mJ-v U/cTI ~0

1051Testing软件测试网8pvI:eL!QZ+L9h

2151Testing软件测试网LUmG,L?%\m7n

42

1fj*`!h\5{1V/\0

8551Testing软件测试网 MEG'KIv r

170

0Y0d q~\d'H5h0s&^0

34151Testing软件测试网 ~ qpt,j*k

682

T6K0[Ax'H0

136551Testing软件测试网7co2^%}1a zd4ARI

….51Testing软件测试网 h']"q y4IS)?n-S7y.x

  呈现阶层递增的趋势。51Testing软件测试网jx#h W6\ I`u'y1Z


TAG:

 

评分:0

我来说两句

Open Toolbar