zoukankan      html  css  js  c++  java
  • 【算法学习笔记】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;
    }
  • 相关阅读:
    84. Largest Rectangle in Histogram (Solution 2)
    84. Largest Rectangle in Histogram (Solution 1)
    73. Set Matrix Zeroes
    【JavaScript】Symbol 静态方法
    【JavaScript】Date
    【JavaScript】Math
    725. Split Linked List in Parts把链表分成长度不超过1的若干部分
    791. Custom Sort String字符串保持字母一样,位置可以变
    508. Most Frequent Subtree Sum 最频繁的子树和
    762. Prime Number of Set Bits in Binary Representation二进制中有质数个1的数量
  • 原文地址:https://www.cnblogs.com/yuchenlin/p/sjtu_oj_1047.html
Copyright © 2011-2022 走看看