专业的游戏资讯门户网站,爱游戏就上Gmae234!
游戏网 > 问答列表 >

时钟问题,百炼

TimeLimit:1000msMemorylimit:65536kB题目描述有9个时钟,排成一个3*3的矩阵。现在需要用最少的移动,将9个时钟的指针都拨到12点的位置。共允许有9种不同的移动。如右表所示,每个移动...

   404

404,您请求的文件不存在!

   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

ask1ask2ask3ask4ask5ask6ask7ask8ask9ask10ask11ask14ask13ask14ask15

游戏推荐更多>