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;
    }
}

 

posted @ 2013-08-11 23:57  cavehubiao  阅读(174)  评论(0编辑  收藏  举报