• The Clocks chapter 1.4


      深深的感受到自己的算法有多菜了,这种题型以前还在poj上做过,每种move超过3次后相当于mode 4,所以每种move只可能0-3 4种情况,用遍历就是4^9种情况。

    开始想的挺好,应为要求组合数最小,又move和次序无关。想着number从1-9然后是11-19 22-29 33-39。。。最后到111222333444...999,这种顺序递增遍历肯定比直接dfs快。

    可是想了半天也组织不好 number递增写法...最后还是用dfs做了,dfs开始也有点头大,无从下手,听说还有bfs做的,待好好研究下。

    /*
    ID: hubiao cave
    PROG: clocks
    LANG: C++
    */
    
    
    
    
    #include<iostream>
    #include<fstream>
    #include<string>
    #include<set>
    
    using namespace std;
    
    
    int clocks[10];
    int clock2[10];
    int step[10];
    
    
    //void print(int n);
    
    int const move[9][9]={{3,3,0,3,3},{3,3,3},{0,3,3,0,3,3},{3,0,0,3,0,0,3},
    {0,3,0,3,3,3,0,3},{0,0,3,0,0,3,0,0,3},{0,0,0,3,3,0,3,3},{0,0,0,0,0,0,3,3,3},{0,0,0,0,3,3,0,3,3}};
    
    
    void dfs(int);
    bool judge();
    
    string globstr("NULL");
    
    int count;
    int main()
    
    {
        ifstream fin("clocks.in");
        ofstream fout("clocks.out");
        for(int i=1;i<=9;i++)
        {
            fin>>clocks[i];
            clocks[i]%=12;
            clock2[i]=clocks[i];
        }
        dfs(1);
        for(int i=0;i<globstr.length();i++)
        {
            if(i<globstr.length()-1)
            fout<<globstr[i]<<" ";
            else
            fout<<globstr[i]<<endl;
        }
        //fout<<count;
    
        return 0;
    
    }
    
    void dfs(int index)
    {
        if(index<=9)
        {
            for(int i=0;i<=3;i++)
            {
                step[index]=i;
                dfs(index+1);
            }
        }
        else
        {
            count++;
            if(judge())
            {
                for(int i=1;i<=9;i++)
                    clocks[i]=clock2[i];
                string str;
                for(int i=1;i<=9;i++)
                {
                    for(int n=0;n<step[i];n++)
                    {
                        char ch=i+48;
                        str=str+ch;            
                    }
                }
                if(globstr=="NULL")
                {
                    globstr=str;
                }
                else
                {
                    if(globstr.length()>str.length())
                        globstr=str;
                    if(globstr.length()==str.length())
                    {
                        for(int i=0;i<str.length();i++)
                        {
                            if(globstr[i]>str[i])
                                globstr=str;
                            if(globstr[i]<str[i])
                                break;
                        }
                    }
                }
                
            }
            for(int i=1;i<=9;i++)
                clocks[i]=clock2[i];
        }
    }
    
    bool judge()
    {
        for(int i=1;i<=9;i++)
        {
            for(int m=0;m<9;m++)
            {
                clocks[i]=clocks[i]+step[m+1]*move[m][i-1];
                clocks[i]=clocks[i]%12;
            }
            if(clocks[i]!=0)
                return false;
        }
        return true;
    }
    
    
    
    
    void print(int n)
    {
    
        if(n>=1)
        {
            for(int i=0;i<=3;i++)
            {
                clocks[n]=i;
                print(n-1);
            }
    
        }
        else
        {
            for(int i=3;i>0;i--)
            {
                cout<<clocks[i];
            }
            cout<<endl;
        }
    }
  • 相关阅读:
    软件版本具体代表什么意思
    面向接口的编程
    MySQL mysqldump用法
    常见问答解答
    Perl 语言笔记
    JAVA 基础知识
    面向接口编程的基本原则
    判断文件存在与否【Linux】
    Gtk Label设置字体颜色
    解压缩路径设置【Linux】
  • 原文地址:https://www.cnblogs.com/cavehubiao/p/3252132.html
Copyright © 2020-2023  润新知