【算法学习笔记】69. 枚举法 字典序处理 SJTU OJ 1047 The Clocks

我们发现这个题里每一种“移动套餐”用的次数只有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;
}
原文地址:https://www.cnblogs.com/yuchenlin/p/sjtu_oj_1047.html