• 【算法学习笔记】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;
    }
  • 相关阅读:
    mongodb 添加用户
    mongo 安装
    python 操作redis
    python 安装 redis
    redis 命令文档网址
    redis 事务
    Redis key命令
    手动卸载的vs2010
    个人封装JavaScript函数
    女学-温砚如老师的人生女学
  • 原文地址:https://www.cnblogs.com/yuchenlin/p/sjtu_oj_1047.html
Copyright © 2020-2023  润新知