题目

有9个时钟,排成一个3*3的矩阵。

现在需要用最少的移动,将9个时钟的指针都拨到12点的位置。共允许有9种不同的移动。如下表所示,每个移动会将若干个时钟的指针沿顺时针方向拨动90度。
移动 影响的时钟

1 ABDE
2 ABC
3 BCEF
4 ADG
5 BDEFH
6 CFI
7 DEGH
8 GHI
9 EFHI

输入

9个整数,表示各时钟指针的起始位置,相邻两个整数之间用单个空格隔开。其中,0=12点、1=3点、2=6点、3=9点。

输出

输出一个最短的移动序列,使得9个时钟的指针都指向12点。按照移动的序号从小到大输出结果。相邻两个整数之间用单个空格隔开。

样例输入

3 3 0
2 2 2
2 1 2

样例输出

4 5 8 9

解题方法

根据我在网上查到的方法,大意是时钟共有4种状态,而不管时钟出于何种状态,拨动时钟4次后时钟会回到最开始的状态,相当于没有移动。这里的1~9种移动方法,任意一种方法使用4次之后,其影响的时钟都会回到最开始的状态,相当于没有使用这种移动方法。于是,每种移动方法只有使用0次、1次、2次和3次这四种情况,一共也就是4^9种情况,枚举这些情况即可。
优化的方法是,像熄灯问题一样,先枚举例如1至3移动方法使用次数的各种情况,一种方法4种情况一共也就是4^3种情况。再根据ABC三个钟只能分别由剩余的456方法移动,以此决定4至6方法的使用次数。再由D、E钟只能由79方法移动,以此决定79方法的移动次数。而GHI钟只能由8方法同时决定移动次数,所以在经过以上的移动后,必须状态相同。最后,检查F钟是否为12点即可。
以下为枚举所有情况的代码。

代码实现

# include <iostream>
# include <cstring>
# include <string>
# include <memory>
using namespace std;
//判断移动方法是否正确
int ClockMove(int clock[][3], int m1, int m2, int m3, int m4, int m5, int m6, int m7, int m8, int m9)
{if((clock[0][0]+m1+m2+m4)%4==0){if((clock[0][1]+m1+m2+m3+m5)%4==0){if((clock[0][2]+m2+m3+m6)%4==0){if((clock[1][0]+m1+m4+m5+m7)%4==0){if((clock[1][1]+m1+m3+m5+m7+m9)%4==0){if((clock[1][2]+m3+m5+m6+m9)%4==0){if((clock[2][0]+m4+m7+m8)%4==0){if((clock[2][1]+m5+m7+m8+m9)%4==0){if((clock[2][2]+m6+m8+m9)%4==0){return 1;}else return 0;}else return 0;}else return 0;}else return 0;}else return 0;}else return 0;}else return 0;}else return 0;}else return 0;
}
//输出
int Output(int a[], int x, int &min)
{for(int i = a[x];i>0;i--,min--){if(min) cout<<x<<" ";else cout<<x;}
}int main()
{int clock[3][3] = {0};int a[10] = {0}; //记录最终方法int b[10] = {0}; //记录中间方法int min = -1;//输入for(int i = 0;i<3;i++)for(int j = 0;j<3;j++) cin>>clock[i][j];for(int i1 = 0;i1<4;i1++){b[1] = i1;for(int i2 = 0;i2<4;i2++){b[2] = i2;for(int i3 = 0;i3<4;i3++){b[3] = i3;for(int i4 = 0;i4<4;i4++){b[4] = i4;for(int i5 = 0;i5<4;i5++){b[5] = i5;for(int i6 = 0;i6<4;i6++){b[6] = i6;for(int i7 = 0;i7<4;i7++){b[7] = i7;for(int i8 = 0;i8<4;i8++){b[8] = i8;for(int i9 = 0;i9<4;i9++){b[9] = i9;int cnt = i1+i2+i3+i4+i5+i6+i7+i8+i9;if(cnt<min||min==-1) {if(ClockMove(clock,i1,i2,i3,i4,i5,i6,i7,i8,i9)){if(min>cnt||min==-1){min = cnt;for(int j = 1;j<10;j++) a[j] = b[j];}}}}}}}}}}}}for(int i = 1;i<10;i++) Output(a,i,min);return 0;
}

程序设计与算法二郭炜枚举002拨钟问题及解题思路相关推荐

  1. 程序设计与算法(二)算法基础-郭炜 1.3.1 称硬币

    程序设计与算法(二)算法基础-郭炜 1.3.1 称硬币 有12枚硬币.其中有11枚真币和1枚假币.假币和真币重量不同,但不知道假币比真币轻还是重.现在,用一架天平称了这些币三次,告诉你称的结果,请你找 ...

  2. 算法训练一(贪心、二分)(含解题思路)(下)

    目录 7-15种树(贪心) AC代码: 7-16会场安排问题(贪心) AC代码: 7-17最优合并问题(贪心) AC代码: 7-18简简单单的数学题(位运算 + 哈希表) AC代码: 7-19h148 ...

  3. 算法训练一(贪心、二分)(含解题思路)(上)

    目录 7-1最少失约(贪心) AC代码: 7-2删数问题(贪心) 7-3区间覆盖(贪心) AC代码: 7-7加油站之最小加油次数(贪心+优先队列) AC代码: 7-8求解删数问题(贪心) AC代码: ...

  4. 花式上分算法大赛,速看鹅厂六强团队解题思路集锦【附PPT下载】

    历经4个月的算法征程,伴随着外部.内部赛道终极答辩,2020腾讯广告算法大赛正式落下帷幕(点击回顾).本届赛事火爆空前,外部赛道吸引了上万名全国选手火热PK,内部赛道的角逐也颇为激烈,吸引了来自 TE ...

  5. 例题代码|程序设计与算法(二) 算法基础 北大 郭炜 中国大学MOOC 笔记

    网站链接

  6. 算法和编程面试题精选TOP50!(附代码+解题思路+答案)

    AI技术年度盛会即将开启!11月8-9日,来自Google.Amazon.微软.Facebook.LinkedIn.阿里巴巴.百度.腾讯.美团.京东.小米.字节跳动.滴滴.商汤.旷视.思必驰.第四范式 ...

  7. 算法和编程面试题精选 TOP50!(附代码+解题思路+答案)

    本篇文章的面试资源,主要包含五部分内容:数组.链表.字符串.二叉树和重要算法(如排序算法)的编程面试题,其中每部分内容,都列出了一些最常被问到的热门问题.并且在每个题目后,给出了可以参考的解决思路和代 ...

  8. 干货 | 算法和编程面试题精选TOP50!(附代码+解题思路+答案)

    作者 | javinpaul 编译 | 王天宇.Jane 整理 | Jane [导读]之前我们给同学们推荐了很多关于 Python 的面试资源,大家都表示很有用.这次营长表示要翻 Java 的牌子啦~ ...

  9. 程序设计与算法郭炜老师的课堂笔记2

    程序设计与算法郭炜老师的课堂笔记2 枚举 完美立方 生理周期 称硬币 熄灯问题 递归 求阶乘 汉诺塔 N皇后 逆波兰表达式 表达式求值 上台阶 放苹果 算24 二分算法 找一对数 分治 归并排序 快速 ...

最新文章

  1. HMM和贝叶斯网络的关系
  2. 5、Scala模式匹配
  3. CreateWindow创建指定宽和高的client区域窗口的方法
  4. HTTP协议03-http特点及请求方式
  5. 【数据库】分库分表策略
  6. openresty开发系列37--nginx-lua-redis实现访问频率控制
  7. SpringBoot集成七牛云-实现文件上传、下载、解决报错、详细案例
  8. oracle逻辑备份和物理备份,oracle数据库物理备份和逻辑备份区别
  9. 【STM32】FreeRTOS简介
  10. 音视频技术开发周刊 | 147
  11. 推荐系统系列教程之十一:那些在Netflix Prize中大放异彩的推荐算法
  12. QQ 二十年沉浮起落,黑产从未缺席
  13. AT2 Homeomorphism and the group structure on a circle
  14. #20165201 macOS中统计代码总行数
  15. python控制风扇_Python语音控制普通风扇实现教程
  16. 德国:认真是一种可怕的力量
  17. .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  18. 分析码农骄傲自大的几点原因
  19. Unity3D iPhone开发入门 (转)iPhoneSettings.
  20. 网站SEO优化做好能抵几个销售?看看杭州石炭纪怎么用网站来干了销售的活!

热门文章

  1. python mse_python 计算平均平方误差(MSE)的实例
  2. 【STM32H7】第13章 任务调度—抢占式,时间片和合作式
  3. 洛克人java下载_洛克人-威利博士末日
  4. excel数据转换成对应公式
  5. Qt利用openGL绘制三棱锥
  6. 尼古拉*特斯拉与通古斯大爆炸
  7. 一部电影,一种人生 (会议分享表述用)
  8. c语言acii 码转化为字母,C语言字符转换ASCII码
  9. ajax $什么意思,请教一下Ajax 的$('')是什么意思?
  10. SSM ==> 超市管理系统(mysql)