汉诺塔VII(题目链接)

思路

本文参考了下列文章

  • 汉诺塔的回顾和深刻 汉诺塔VII
  • 首先用数组将每一个样例的状态存储

    • 数组的每一行存储一个柱子的状态
    • 每一行的第0列存储柱子上盘子的数目
    • 其后从下到上存储柱子对应位置上的盘子的编号
  • 使用函数根据在移动盘子的过程中的规律判断

    • 当盘子的数目为奇数时,在移动过程中,第奇数个柱子的最低位置上的盘子编号为奇数
    • 当盘子的数目为偶数时,则相反
    • 并且每一个柱子上的盘子的编号必定交替出现

代码

#include <iostream>
using namespace std;//存储输入的状态,tab[i][0]表示第i个柱子上的盘子数目,后面依次为盘子的编号
int tab[3][65];//判断tab中的状态是不是移动n个盘子时的中间状态
int f(int n){                                       //输入为盘子的数目 for(int i = 0; i < 3; ++i){                        //分别判断三个柱子 if(0 == tab[i][0]){                            //若该柱子没有盘子 continue;                                //直接判断下一个柱子 }//奇数个盘子时在第奇数个柱子的最下面的盘子的编号为奇数,偶数相反 if((n+i) % 2 != tab[i][1] % 2){             //若不相同 return 0;                                //直接返回false }//每个柱子上的盘子编号应该是奇偶数交替 for(int j = 2; j <= tab[i][0]; ++j){       //循环柱子上的每一个盘子 if((tab[i][j-1]+tab[i][j]) % 2 == 0){  //若编号不是交替 return 0;                         //直接返回false }}      }return 1;                                      //条件满足,返回true
}int main(){int t, n;                                       //定义变量 cin >> t;                                      //输入样例数 while(t--){                                     //循环t次 cin >> n;                                  //输入盘子数目//输入柱子上的盘子状态                 for(int i = 0; i < 3; ++i){                  //循环 cin >> tab[i][0];                        //输入柱子上盘子数目 for(int j = 1; j <= tab[i][0]; ++j){ //循环 cin >> tab[i][j];                    //输入柱子上的盘子编号}}if(f(n)){                                 //若返回为 1 cout << "true" << endl;                  //输出true }else{                                     //否则 cout << "false" << endl;             //输出false }}return 0;
}

总结

当看到题目时,基本的模拟做出来了之后,应该仔细思考看看有没有什么规律

【HDU 1997】汉诺塔VII相关推荐

  1. HDU 1997 汉诺塔VII

    汉诺塔VII Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem D ...

  2. 汉诺塔系列问题: 汉诺塔II、汉诺塔III、汉诺塔IV、汉诺塔V、汉诺塔VI、汉诺塔VII

    汉诺塔II:(hdu1207) /先说汉若塔I(经典汉若塔问题),有三塔,A塔从小到大从上至下放有N个盘子,现在要搬到目标C上, 规则小的必需放在大的上面,每次搬一个,求最小步数.这个问题简单,DP: ...

  3. 汉诺塔VII(递推,模拟)

    汉诺塔VII Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  4. HDU——2064汉诺塔III

    汉诺塔III Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  5. HDU 2064:汉诺塔III

    汉诺塔III Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  6. hdu 2064汉诺塔III 递推

    汉诺塔递推题,比汉诺塔多了一个限制条件,盘子只允许在相邻的柱子之间移动. 分析: 第1步:初始状态: 第2步:把上面的n-1个盘移到第3号杆上: 第3步:把第n个盘从1移到2: 第4步:把前n-1个从 ...

  7. HDU 1207 汉诺塔II (递推)

    经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘.上 ...

  8. hdu 1207 汉诺塔II (四柱汉诺塔)

    思路是借鉴网上一大牛的,写的很完美了,所以一句没改,代码是自己敲的,C语言版 变体汉诺塔 问题描述:在经典汉诺塔的基础上加一个条件,即,如果再加一根柱子(即现在有四根柱子a,b,c,d),计算将n个盘 ...

  9. 杭电_ACM_汉诺塔VII

    Problem Description n个盘子的汉诺塔问题的最少移动次数是2^n-1,即在移动过程中会产生2^n个系列.由于发生错移产生的系列就增加了,这种错误是放错了柱子,并不会把大盘放到小盘上, ...

最新文章

  1. 2016_6_27日报
  2. Git 提交代码 简单步骤
  3. 科研工作者一般怎么找文献?
  4. BZOJ2212——线段树合并
  5. 两个excel文档查找相同选项后替换_看似普通的查找和替换功能,用好了,能让你的工作效率翻一番...
  6. 大数据是企业未来最重要的资源
  7. 珠江三角洲 芯片恩仇录
  8. wps java转换成doc_WPS能转PDF吗?WPS转换不能错过的一款软件!
  9. ora-04098 触发器无效且未通过重新验证
  10. maven 项目在 tomcat 中启动报错:Caused by: java.util.zip.ZipException: invalid LOC header (bad signature)...
  11. CCIE试验备考之交换VLAN间路由
  12. txtv28pw河南某中学_有一种寒冷叫不穿秋裤!河南一中学班主任让学生列队挨个检查秋裤...
  13. 微信公众号跳转H5页面-用户授权-返回openId以及access_token
  14. Tout= ((arr+1)*(psc+1))/Tclk公式理解汇总
  15. vs2017 项目开发 解决方案下的多个项目
  16. android 实现果冻动画效果,手把手教你绘制Android粘性果冻动画组件
  17. 建服务器数据中心,如何构建一个服务器数据中心
  18. mixpanel实验教程(2) 支持你啊
  19. office卸载工具怎么用(官方干净卸载方法)
  20. 新浪微博2012校招笔试题

热门文章

  1. PS学习之如何截取图形的一部分
  2. 从SEED种子数据库还原出其他库
  3. python批量读取图片文件大小_python 批量更改图像尺寸到统一大小
  4. USACO 2008 OCT gold 牧草
  5. python学习笔记之类和对象
  6. Altium Designer AD 2019最新各种元器件的原理图库、封装库、集成库、3D库,总量达四千多个,分类齐全。
  7. [跟着需求出方案,跟着方案学运维]批量修复漏洞-ssh弱密钥交换算法
  8. HDLBits练习——Lfsr32
  9. Mysql数据库复制及备份
  10. win10 Cookie应该保留在本地哪里