我们发现这个题里每一种“移动套餐”用的次数只有0,1,2,3 是有效的,4和0是一样的。
所以我们开一个数组rot[10]来记录这9个套餐分别用了多少次。
字典序的处理和我们的枚举顺序息息相关。
我们从 000000000 到 333333333 来枚举的话,第一个符合条件的结果当然就是所有答案中字典序最小的一个了。
枚举这个排列我们需要用9个for,当然也可以用递归来实现,不过我还是喜欢视觉感比较强烈的9个for。。。。
在每一种排列下,我们需要通过这些套餐的方案来计算临时结果path。
然后判断是不是所有的钟表都达到了12点。
如果是的话,我们就可以输出了。
输出的时候,要记得把套餐使用次数利用上。。。
#include <iostream> using namespace std; int clocks[10];//记录输入的 int rot[10]; //记录转动次数 int main(int argc, char const *argv[]) { for (int i = 1; i <= 9; ++i){ cin>>clocks[i]; } int path[10]={0}; for (rot[1] = 0; rot[1] < 4; ++rot[1]) for (rot[2] = 0; rot[2] < 4; ++rot[2]) for (rot[3] = 0; rot[3] < 4; ++rot[3]) for (rot[4] = 0; rot[4] < 4; ++rot[4]) for (rot[5] = 0; rot[5] < 4; ++rot[5]) for (rot[6] = 0; rot[6] < 4; ++rot[6]) for (rot[7] = 0; rot[7] < 4; ++rot[7]) for (rot[8] = 0; rot[8] < 4; ++rot[8]) for (rot[9] = 0; rot[9] < 4; ++rot[9]){ //枚举出一种全体转动情况 一共有4^9种 //根据转动情况 确定结果 path[1] = (clocks[1] + 3*(rot[1] + rot[2] + rot[4] )) % 12; path[2] = (clocks[2] + 3*(rot[1] + rot[2] + rot[3] + rot[5] )) % 12; path[3] = (clocks[3] + 3*(rot[2] + rot[3] + rot[6] )) % 12; path[4] = (clocks[4] + 3*(rot[1] + rot[4] + rot[5] + rot[7] )) % 12; path[5] = (clocks[5] + 3*(rot[1] + rot[3] + rot[5] + rot[7] + rot[9] )) % 12; path[6] = (clocks[6] + 3*(rot[3] + rot[5] + rot[6] + rot[9] )) % 12; path[7] = (clocks[7] + 3*(rot[4] + rot[7] + rot[8] )) % 12; path[8] = (clocks[8] + 3*(rot[5] + rot[7] + rot[8] + rot[9])) % 12; path[9] = (clocks[9] + 3*(rot[6] + rot[8] + rot[9] )) % 12; int sum = 0; for (int i = 1; i <= 9 ; ++i) sum += path[i];//若全是12 则全是0 if(!sum){ //找到了第一个解 也就是字典序的最小解 //输出解 for (int i = 1; i <= 9; ++i) { for (int j = 0; j < rot[i]; ++j) { //rot存的是个数 cout<<i<<" "; } } cout<<endl; return 0; } } return 0; }