题目
汉诺塔,有n个柱子,按顺序把从零开始的编号盘子放上去,每次同一个柱子上的相邻的两个盘子编号加和需要是平方数,如果不行就放到下一个柱子上,直到不能放位置,问最多能放多少个。
分析
模拟,直接模拟即可。
说明
(⊙o⊙)…
#include <stdio.h>
#include <math.h>
int pegs[55];
int main()
{
int t, n;
while (~scanf("%d", &t))
while (t --) {
scanf("%d", &n);
for (int i = 1; i <= n; ++ i) {
pegs[i] = 0;
}
for (int i = 1; ; ++ i) {
int index = 1, sqrt_v = 0, value = 0;
while (pegs[index] && index <= n) {
value = pegs[index] + i;
sqrt_v = (int)sqrt(value + 0.1);
if (sqrt_v*sqrt_v == value) {
pegs[index] = i;
break;
}else {
index++;
}
}
//printf("index [%d] : %d\n", index, i);
if (index > n) {
printf("%d\n", i-1);
break;
}else {
pegs[index] = i;
}
}
}
return 0;
}