九连环-递归解法
//求取下n环和放上n环的步数
int ans;
//规则一:第一环可以在任何时候放上或取下环柄。
//规则二:只有紧跟在领头环后的环可以放上或取下环柄。(领头环是套在柄上的最前面的环
int DownRing(int);
int UpRing(int);
int DownRing(int n)
{
int res = 0;
if(n == 1)
return 1;
if(n>2)
res = (res + DownRing(n-2))%SMod; //移下n-2个,第n-1个变为领头环
res += 1; //移下第n个
if(n>2)
res = (res + UpRing(n-2))%SMod; //将n-2个移上去,以便移下第n-1个
if(n>1)
res = (res + DownRing(n-1))%SMod; //此时就变成了将n-1个移下去了
return res;
}
int UpRing(int n)
{
int res = 0;
if(n == 1)
return 1;
if(n>1)
res = (res + UpRing(n-1))%SMod; //移上n-1个
if(n>2)
res = (res + DownRing(n-2))%SMod; //将n-2个移下,此时第n-1个变成领头环
res += 1; //移上第n个
if(n>2)
res = (res + UpRing(n-2))%SMod; //将n-2个环移上去
return res;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
printf("%d\n",DownRing(n));
return 0;
}
作者:whatbeg
出处1:http://whatbeg.com/
出处2:http://www.cnblogs.com/whatbeg/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
更多精彩文章抢先看?详见我的独立博客: whatbeg.com