B
来源:互联网 发布:c语言6.0下载 编辑:程序博客网 时间:2024/04/30 10:07
题意:
给出汉诺塔原型
求在第几步的时候这个汉诺塔每一根柱子上面的盘子数一样多
题解:
打表找规律
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int k;int s[10];int hanoi(char a,char b,char c,int n){ if(n==0) return 0; if(hanoi(a,c,b,n-1)) return 1; --s[a-'a'],++s[b-'a'],s[c-'a']; if(s[a-'a']==s[b-'a']&&s[b-'a']==s[c-'a']){ printf("%d\n",k); return 1; } k++; if(hanoi(c,b,a,n-1)) return 1;}int main(){ int n; //freopen("out.txt","w",stdout); for(int i=3;i<=30;i+=3) { k=1; s[0]=i; s[1]=s[2]=0; hanoi('a','b','c',i); } return 0;}
得到规律:
num【3】= 2,num【6】=9,num【12】=38
当 i 为奇数的时候:num【i】=num【i-3】*4+2
当 i 为偶数的时候:num【i】=num【i-3】*4 - t【i】
其中 t【i】=t【i-6】*4+21
然后大整数处理一下就可以了
import java.io.File;import java.io.FileNotFoundException;import java.io.PrintWriter;import java.math.BigInteger;import java.util.Scanner;public class Main {public static void main(String[] args) throws FileNotFoundException {Scanner cin = new Scanner(new File("input.txt"));PrintWriter print = new PrintWriter(new File("output.txt"));int n;BigInteger []t = new BigInteger[307];BigInteger []num = new BigInteger[307];num[3] = BigInteger.valueOf(2);num[6] = BigInteger.valueOf(9);t[12] = BigInteger.valueOf(17);num[9] = BigInteger.valueOf(38);for(int i = 12;i<=300;i+=3){if((i%2)==0){num[i] = num[i-3].multiply(BigInteger.valueOf(4)).subtract(t[i]);t[i+6] = t[i].multiply(BigInteger.valueOf(4)).add(BigInteger.valueOf(21));}else {num[i] = num[i-3].multiply(BigInteger.valueOf(4)).add(BigInteger.valueOf(2));}}while(cin.hasNext()){n = cin.nextInt();print.println(num[n]);}cin.close();print.close();}}
阅读全文
0 0
- b
- b
- b
- //b
- B
- b
- B
- B
- B
- B
- b
- B
- B
- B
- B
- B
- B
- b
- 解决git The following untracked working tree files would be overwritten by merge
- 一起lintcode ------- 二分查找看这篇就够了
- Angular实现tab切换
- spring文章记录
- HFOI2017.7.14校内赛(普及组)题解
- B
- JSP内置对象
- C++vector容器大小增长规律的总结
- Android 序列化
- Redis服务器端安装
- SSIS包配置
- [编程珠玑]-第八章:连续子向量的最大和
- excel 页面兼容性导出
- Spring MVC结果跳转方式