問題 H: 九連環
時間限制: 1 Sec 內存限制: 128 MB
題目描述
九連環是一種源於中國的傳統智力遊戲。如圖所示,九個圓環套在一把“劍”上,並且互相牽連。遊戲的目標是把九個圓環從“劍”上卸下。
圓環的裝卸需要遵守兩個規則。
第一個(最右邊)環任何時候都可以裝上或卸下。
如果第k個環沒有被卸下,且第k個環右邊的所有環都被卸下,則第k+1個環(第k個環左邊相鄰的環)可以任意裝上或卸下。
與魔方的千變萬化不同,解九連環的最優策略是唯一的。爲簡單起見,我們以“四連環”爲例,演示這一過程。這裏用1表示環在“劍”上,0表示環已經卸下。
初始狀態爲1111,每部的操作如下:
1101(根據規則2,卸下第2個環)
1100(根據規則1,卸下第1個環)
0100(根據規則2,卸下第4個環)
0101(根據規則1,裝上第1個環)
0111(根據規則2,裝上第2個環)
0110(根據規則1,卸下第1個環)
0010(根據規則2,卸下第3個環)
0011(根據規則1,裝上第1個環)
0001(根據規則2,卸下第2個環)
0000(根據規則1,卸下第1個環)
由此可見,卸下“四連環”至少需要10步。隨着環數增加,需要的步數也會隨之增多。例如卸下九連環,就至少需要341步。
請你計算,有n個環的情況下,按照規則,全部卸下至少需要多少步。
輸入
輸入第一行爲一個整數m ,表示測試點數目。
接下來m行,每行一個整數n。
輸出
輸出共m行,對應每個測試點的計算結果。
思路:https://blog.csdn.net/kuronekonano/article/details/81490009(cls nb!!!!!!!!!!!!!!!!)
代碼:
import java.io.*;
import java.util.*;
import java.math.*;
public class Main{
public static void main(String args[]){
Scanner cin=new Scanner(System.in);
int t;
t=cin.nextInt();
while(t>0){
int a;
a=cin.nextInt();
int ou=1;
if(a%2==0){
a=a;
ou=0;
}
else {
a=a+1;
}
BigInteger b;
BigInteger c;
b=BigInteger.valueOf(1);
c=BigInteger.valueOf(2);
while(a>0){
if(a%2==1) b=b.multiply(c);
c=c.multiply(c);
a=a/2;
}
BigInteger www;
www=BigInteger.valueOf(1);
BigInteger ww;
ww=BigInteger.valueOf(3);
b=b.subtract(www);
b=b.divide(ww);
BigInteger w;
w=BigInteger.valueOf(2);
if(ou==0) b=b.multiply(w);
System.out.println(b);
t=t-1;
}
}
}