#include <stdio.h>
int a[110], AA[110], m;
//AA[i]存储的是在不考虑size =i的盘子的顺序,考虑size<i的顺序的前提下,
//将size <=i的盘子搬到别一个peg上所用的部数
int BB(int n)
{
if(a[n] == 1)
return AA[n];
else if(n == 1)
return 2 * a[n] - 1;
else
return 2 * AA[n - 1] + 2 * a[n] + BB(n - 1);
}
void init(int n)
{
int i;
AA[1] = a[1] % m;
for(i = 2; i <= n; i++)
AA[i] = (2 * AA[i - 1] + a[i]) % m;
}
int main()
{
//n代表一共有几种size的盘子,而a[i]代表长度为i的盘子的个数
int n, i;
while(scanf("%d %d", &n, &m) != EOF)
{
for(i = 1; i <= n; i++)
scanf("%d", a+i);
init(n);
int temp = BB(n);
printf("%d/n", BB(n) % m);
}
return 0;
}
本文提供了一种解决汉诺塔问题的算法实现,通过递归函数计算移动不同大小盘子所需的步骤数,并使用动态规划预处理部分结果来提高效率。
749

被折叠的 条评论
为什么被折叠?



