九连环的递归算法(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?:Hi*R/f二、九连环的规律51Testing软件测试网 Mq-KV?@"T
51Testing软件测试网 | Y Lb'Y o!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:\b u0 (a)第 n-1个环在架上
,fzsr!mf(FQN.r0j\5^m:h"A5p0 (b)前 n-2个环全部在架下
RK9v y8HT0]7P#n-q[ ^u)r~0 三、拆解/安装的过程51Testing软件测试网lM2?JWGK+s
\6a+ak3C0UAT0 正确的拆解是先以第 9环为目标,先拆下它,简化为拆一个 8连环。接着再也第 8 环为目标,拆下它,简化为拆一个 7连环。以此类推,直至全部拆解。51Testing软件测试网P&M4J;A;N3a"}8JH
kex,M%F,?0 其实安装和拆解是一个道理,因为他们均是使用上面说的规律来完成的。
#l,V'PmwC6k;Gt0@AN)N8s"Hi$YP8ws.K0 正确是安装也是先以第 9环为目标,先装上它,简化为装一个 8连环。接着再也第 8 环为目标,装上它,简化为装一个 7连环。以此类推,直至全部安装。
2S"x"AHJ(V"g0/V8fnO:yo'}0 当然,现在这么说是便于理解,当你深刻的理解了上面所说的规律后,就会发现,安装上第 9环后,问题可以被简化为装一个 7连环,而当装上第 7 环后,问题就被简化为装一个 5连环了,呵呵,就是这样的,不知道你现在是否明白我的意思……51Testing软件测试网sl%i!{ M7u
51Testing软件测试网3I `b t"{6fW,M四、一个猜想51Testing软件测试网S*G-R9D{)Py@
51Testing软件测试网E AL ap仔细观察九连环的结构、思考九连环的规律及拆解/安装的过程,你是不是有一种感觉:九连环跟递归一定有联系。你看,递归的基本思想是把一个大的问题分解 为一个规模较小的问题,从这些较小问题的解,构造出大问题的解,而这些规模较小的问题,用同样的方法分解成更小的问题,从更小问题的解,构造出较小的问 题,一层层下去,一般最后总是可以分解到可以直接求解的小问题。嘿嘿,九连环的拆解/安装多么的符合这个规律啊……^_^
3GI,RXN1L L5p051Testing软件测试网`[y_-Z+z|1Q五、算法实现51Testing软件测试网a5g~0e+I4xh6y-l
51Testing软件测试网G'Pl+T |以下是算法实现,程序写的很简洁,省略了很多功能的实现,比如计数等,如果你觉得有必要的话,可以自行添加上去,我相信很容易,并不要很多的改动。
jR\^~051Testing软件测试网fT ia'^The C Code Here:51Testing软件测试网KlVT9O)Cvm&n
51Testing软件测试网t"}{aG+N/\ /****************************/ void UpRing(int n); /*函数声明*/51Testing软件测试网R|J-of~0Z"F*B /]lkBn/?`!e0void DownRing(int n) /*下环逻辑*/ void UpRing(int n) /*上环逻辑*/51Testing软件测试网&z*?4~&k)WxW'B void main() ;il`F%g0v]:[CEH0{ .q kJ5Y+{Ik/E$P9c0/M
bB"i8ct
AK0 printf("拆解\n");51Testing软件测试网0RK v6y/M&K |
mWB9[ ptQ2X;F0
M ax5Djbf'i0The C++ Code Here:51Testing软件测试网9pvi$cV"Dg
,lY9NIp#?d0/****************************/51Testing软件测试网1c2]i k H `&XO
任意 N连环均适用
Td'{9E4CAp:H0 日期:2012/8/1251Testing软件测试网.@(?"M$Z*W6j:Gk
:OwQ.Ae&c0 程序设计:YCY
,Q Y VN5xzr@0 电邮:ycy360@163.com51Testing软件测试网i6R4u[)pG6f-L
@XOn,L$WW$L0/****************************/
}i/OU\UFD051Testing软件测试网:D0E$zo8p"cPit[U!N0
*~"Q#?t(n_E0#include<iostream>
)Khk7I&D,`+v0TdzkH"SK0using namespace std;
v'IX E"d.^,H;O+yC051Testing软件测试网 Y h-u#Zreuec51Testing软件测试网b)S f4hj(o8w s{
51Testing软件测试网]'W9_6]K\-s0x~iv D bclass Ring
%xnEtz:H0x;V'K0M v7t7Ic0{51Testing软件测试网 e gXv*mW D"` ecF
51Testing软件测试网 tF ?YuDpublic:
*Ne e T3_051Testing软件测试网'P$[,o:d ^_;D#vRing(int n):nRingNum(n){}
'nD sJ kS4B051Testing软件测试网 k~9p^L%pDe"cvoid UpRing(int n);51Testing软件测试网J'_ vM 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{05`5Z\h,J0\ zz0 void totalCnt();51Testing软件测试网Kb s*x5ht
51Testing软件测试网 q]bq:ZJvoid setUpZero();51Testing软件测试网*IC Wk7{glhfT
51Testing软件测试网va;vTz"[!C.l-iprivate:
~A5@KQ;Af2\z0AD,z7M&v0 int nRingNum;
S9b2^ pv9f&~2e7Q t051Testing软件测试网*hRcum v4h'\"Pstatic int s_nCnt;
{q(G)`C5R)o0jP-H4eSI:u0};
*M'Hx5l-S_0)@ [M(g?^ A4M.BBG |U0 51Testing软件测试网-rFU\y;Wr J
51Testing软件测试网FU6pJQBBl.[aint Ring::s_nCnt = 0; //计数51Testing软件测试网nn{bxC5J
51Testing软件测试网:`7h9k7V"?6HXHrvoid Ring::UpRing(int n) //Upring是DownRing的逆过程.51Testing软件测试网H*iaH1o%}#b LkNXc
f4K(Db f0{
$@m_q N2Ilg3j iA ?0zyb#s"f y0 ++s_nCnt;51Testing软件测试网jkylJ
}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"ix0v wcout << "上第" << n << "环" << endl;51Testing软件测试网1x e(_uk0r,Byh
51Testing软件测试网2w9yJ)B+Xc3Hif(n>2) UpRing(n-2);51Testing软件测试网9J9h6mRl*OB:|)~
,la q @(b/|u~0}51Testing软件测试网MH1z.mr |Z:r
51Testing软件测试网!j2z-Sk5w$BT6h51Testing软件测试网 {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'sN k
51Testing软件测试网*v0~Ra+eyp!hxif(n>2) DownRing(n-2);51Testing软件测试网EZ#h:V7v
{4Ig8n6J[8Bo8r0 cout <<"下第" << n << "环" << endl;
2Un-Tg/CsN%^1N1H06r|yO?#Q7sw0 if(n>2) UpRing(n-2);
R d;cjs{2u051Testing软件测试网C$A0XKN3rif(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+LTsG4Gt S!Jvoid Ring::startDownRing()
A9w1K-Hlf*mw051Testing软件测试网0Z%T#H{ R2] _t(T]5\{
3Ui#N-U:t0F.i"u['^051Testing软件测试网z|$YjEG_t5Gcout << "拆解" << nRingNum << "连环操作!" << endl;51Testing软件测试网1KC ijj}Icd
51Testing软件测试网+D A2\sV{DownRing(nRingNum);
1zs(\Or L3GY051Testing软件测试网EMU U-Bcout << "拆解完毕" << endl;51Testing软件测试网h9d^;DZ:NN-~4W
51Testing软件测试网;@5\T]Q%|/rO2y"_;o}51Testing软件测试网"^z0_0\xx9R
{tk8Po }:I0 51Testing软件测试网]1Q[jVIg,G
51Testing软件测试网6k~0r+W9`void Ring::startUpRing()51Testing软件测试网{E.Z!Q*`5c@.d
51Testing软件测试网!MQimg%}9Q+N{
u.H \eT#`(E)u3@051Testing软件测试网1iH fl{+a'Fcout << "安装" << nRingNum << "连环操作!" << endl;51Testing软件测试网Yu#s/x }&VL"y&jg
/JG+Z#\A/TC&of0 UpRing(nRingNum);51Testing软件测试网7y#T,@L {:]5J4a3d
51Testing软件测试网8NF5l#e1h2v!G r'Ucout << "安装完毕" << endl;
%m+{%x0R"m*I(N$~8J"cJ051Testing软件测试网9H#u9z*y$d8sAn}
J2ZI u\q0fS'cVw0Y'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"a08rc _?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!?EYh9JN
void Ring::setUpZero()51Testing软件测试网 lN1d&~8z
51Testing软件测试网&P.JF6OSrQ Z4V{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^pF'{#h0ZB
?e*g*Tk,F2vY0int main()
/V+jreu-c051Testing软件测试网3O} D3`O-g'CdSu{51Testing软件测试网7E4{2hS4p%F0`a_`,_
51Testing软件测试网gui7z3dY'BRing ring(3);
%p&bK0p+_&q02DZ 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软件测试网BV\k1q*h51Testing软件测试网3s4JXm C.j }
0d"v8U?\r(p0 ring.startUpRing();
\A k:QzWgD051Testing软件测试网ThO6?)[aring.totalCnt();51Testing软件测试网\'g9IH&OQO E
+YE{o.JsB QY+M0 ring.setUpZero();
YY2y8]}`051Testing软件测试网rCevg8YTbW;m@ OtAi0
I z5Nd(R'kD(^ {6M0 return 0;51Testing软件测试网W-k MH1?"pK6C ]
51Testing软件测试网?;|j.w8D^}51Testing软件测试网wp @5z#fV'h fl
51Testing软件测试网:c%c0U~4A}&J存在以下序列即:51Testing软件测试网I2^sn&Ug
51Testing软件测试网a0Z"nbRk[#u
51Testing软件测试网[a+}%K \q?}+J N(numOfRing) }x,u#tq[k}l$_0 | 151Testing软件测试网}"TP+Y)|FFN | 2 9H c.RCo`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.PB3Qw4L l | 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:
不要让那些真正对你好的人,慢慢的从你的生活中消失,无论爱情还是友情,都需要用心经营。
我的栏目
标题搜索
日历
|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
1 | 2 | 3 | 4 | ||||||
5 | 6 | 7 | 8 | 9 | 10 | 11 | |||
12 | 13 | 14 | 15 | 16 | 17 | 18 | |||
19 | 20 | 21 | 22 | 23 | 24 | 25 | |||
26 | 27 | 28 | 29 | 30 | 31 |
我的存档
数据统计
- 访问量: 3341747
- 日志数: 1640
- 建立时间: 2011-12-07
- 更新时间: 2019-12-24