汉诺塔IV
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5187 Accepted Submission(s): 3750
Problem Description
还记得汉诺塔III吗?他的规则是这样的:不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到小盘的上面。xhd在想如果我们允许最大的盘子放到最上面会怎么样呢?(只允许最大的放在最上面)当然最后需要的结果是盘子从小到大排在最右边。
Input
输入数据的第一行是一个数据T,表示有T组数据。
每组数据有一个正整数n(1 <= n <= 20),表示有n个盘子。
每组数据有一个正整数n(1 <= n <= 20),表示有n个盘子。
Output
对于每组输入数据,最少需要的摆放次数。
Sample Input
2 1 10
Sample Output
2 19684
Author
xhd
递推
#include<stdio.h>
__int64 f(int n){
__int64 ans = 1;
for(int i = 1; i < n; i++)
ans *= 3;
return ans;
}
int main(){
int t,n;
scanf("%d", &t);
while(t --){
scanf("%d", &n);
__int64 ans = f(n);
printf("%I64d\n", ans+1);
}
return 0;
}
java版
import java.util.Scanner;
public class Main {
int t,n,ans;
public int slove(Main x){
for(int i = 1; i < x.n; i++)
x.ans *= 3;
return x.ans;
}
public static void main(String[] args){
Scanner in = new Scanner(System.in);
Main x = new Main();
x.t = in.nextInt();
while(x.t > 0){
x.ans = 1;
x.t --;
x.n = in.nextInt();
System.out.println(x.slove(x)+1);
}
}
}