坚决打造绿色网络安全环境,禁止发布不当信息,发布需实名认证,已清理未实名用户

时钟问题,百炼

  •    234游戏网友 提出于 2019-07-27 01:08:53
  • TimeLimit:1000msMemorylimit:65536kB题目描述有9个时钟,排成一个3*3的矩阵。现在需要用最少的移动,将9个时钟的指针都拨到12点的位置。共允许有9种不同的移动。如右表所示,每个移动...

    请注意:本网坚决拥护中国共产党领导,坚决打击任何违规违法内容,若您发现任何有害信息,请E-Mail:q@qimei168.com举报,我们核实后将给予现金奖励!爱国是每个中国人应尽的责任,爱国从我做起!为实现中国梦,实现中国腾飞而努力!

    2019-04-25 03:12:36

    最佳回答 每一个钟拨4次和没有拨是一样的 所以枚举出 4的9次方中情况就可以了
    #include 
     
    using namespace std;
     
    int action[9][9] =
    {
    // {a,b,c,d,e,f,g,h,i},
        {1,1,0,1,1,0,0,0,0},
        {1,1,1,0,0,0,0,0,0},
        {0,1,1,0,1,1,0,0,0},
        {1,0,0,1,0,0,1,0,0},
        {0,1,0,1,1,1,0,1,0},
        {0,0,1,0,0,1,0,0,1},
        {0,0,0,1,1,0,1,1,0},
        {0,0,0,0,0,0,1,1,1},
        {0,0,0,0,1,1,0,1,1}
    };
    int input[9];
    int step[9];
    bool IsDone()
    {
        for(int i = 0; i < 9; ++i)
        {
            int tem = input[i];
            for(int j = 0; j < 9; ++j)
            {
                for(int k = 0; k < step[j]; ++k)
                    tem = (tem + action[j][i]) % 4;
            }
            if(tem) return false;
        }
        return true;
    }
     
    void output()
    {
        for(int i = 0; i < 9; ++i)
            for(int j = 0; j < step[i]; ++j)
                printf("%d ",i + 1);
        printf("");
    }
     
    void dfs(int x)
    {
        if(x > 9) return ;
        if(IsDone())
        {
            output();
            return;
        }
        else
        {
            for(int i = 0 ;i < 4;++i)
            {
                step[x] = i;
                dfs(x+1);
            }
        }
    }
     
    int main()
    {
        for(int i = 0; i < 9; ++i)
            scanf("%d",&input[i]);
        dfs(0);
        return 0;
    } 若未找到您需要的回答,请添加微信公众号每日时讯榜(搜索公众号或者,第一个公众号即是)留言即可,管理员会在第一时间内给予答复。

    2019-04-25 03:12:36

      相似问题

      精彩推荐