2016-2017 ACM Central Region of Russia Quarterfinal Programming Contest BHanoi tower
阿新 • • 發佈:2018-09-17
ssi fin rdquo main \n n) src pro turn
B Hanoi tower
It has become a good tradition to solve the “Hanoi tower” puzzle at programming contests in Rybinsk. We will review the rules briefly.
2*n/3-1移到C上,再從A移動一個到B上
再把C的n/3-1移到B上,現在所有上面都是1/3了
隊友得到了一個神奇的公式2^(n-n/3-1)+2^(n/3-1)-1
但是經過提交是不行的,所以暴力打表找規律
#include <stdio.h> usingnamespace std; int num[3],f,f1; int move(int n,int a,int b) { //printf("Move disk %d from %c to %c\n",n,a,b); num[a]--,num[b]++; if(num[0]==num[1]&&num[1]==num[2])return 1; return 0; } void hanoi(int n,int a,int b,int c) { if(f1)return; if(n==1) {if(move(n,a,c)) { printf("%d\n",f); f1=1; return; } } else { hanoi(n-1,a,c,b); f++; if(move(n,a,c)) { printf("%d\n",f); f1=1; return; } hanoi(n-1,b,a,c); } } int main() { int n; for(int n=3; n<=30; n+=3) { num[0]=n,num[1]=num[2]=f=0,f1=0; hanoi(n,0,1,2); } return 0; }
很快就會發現偶數的猜想是對的,所以對奇數進行討論,發現正好是*4+2
暴力代碼,交的表,因為莫名RE
import java.math.*; import java.util.*; public class Main { public static void main(String args[]) { Scanner cin=new Scanner(System.in); BigInteger tmp=BigInteger.ZERO; for(int n=3; n<=300; n+=3) { if(n/3%2==1) { System.out.println("\""+tmp.multiply(BigInteger.valueOf(4)) .add(BigInteger.valueOf(2))+"\","); } else { int x=n-n/3-1; int y=n/3-1; tmp=cal(x).add(cal(y)).subtract(BigInteger.ONE); System.out.println("\""+tmp+"\","); } } } static BigInteger cal(int x) { BigInteger ans=BigInteger.ONE; ans=ans.shiftLeft(x); return ans; } }
2016-2017 ACM Central Region of Russia Quarterfinal Programming Contest BHanoi tower