1 Star 0 Fork 0

徒步天下 / 程序设计与算法二OJ题解

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
002:拨钟问题.md 3.97 KB
一键复制 编辑 原始数据 按行查看 历史
徒步天下 提交于 2017-11-14 23:30 . 更新 002:拨钟问题.md

002:拨钟问题

总时间限制: 1000ms 内存限制: 65536kB 描述

有9个时钟,排成一个3*3的矩阵。

|-------|    |-------|    |-------|
|       |    |       |    |   |   |
|---O   |    |---O   |    |   O   |
|       |    |       |    |       |
|-------|    |-------|    |-------|
    A            B            C    

|-------|    |-------|    |-------|
|       |    |       |    |       |
|   O   |    |   O   |    |   O   |
|   |   |    |   |   |    |   |   |
|-------|    |-------|    |-------|
    D            E            F    

|-------|    |-------|    |-------|
|       |    |       |    |       |
|   O   |    |   O---|    |   O   |
|   |   |    |       |    |   |   |
|-------|    |-------|    |-------|
    G            H            I    
(图 1)

现在需要用最少的移动,将9个时钟的指针都拨到12点的位置。共允许有9种不同的移动。如下表所示,每个移动会将若干个时钟的指针沿顺时针方向拨动90度。

移动    影响的时钟
 1         ABDE
 2         ABC
 3         BCEF
 4         ADG
 5         BDEFH
 6         CFI
 7         DEGH
 8         GHI
 9         EFHI    

输入9个整数,表示各时钟指针的起始位置,相邻两个整数之间用单个空格隔开。其中,0=12点、1=3点、2=6点、3=9点。输出输出一个最短的移动序列,使得9个时钟的指针都指向12点。按照移动的序号从小到大输出结果。相邻两个整数之间用单个空格隔开。

样例输入

3 3 0 
2 2 2 
2 1 2 

样例输出

4 5 8 9

来源1166

题解

#include <cstdio>
#include <cstring>
#include <iostream>

int mode[9];
int minstepcount=36;
char minstep[36];

int initmode()
{
    char *modestr[]={
            "ABDE", "ABC", "BCEF",
            "ADG", "BDEFH", "CFI",
            "DEGH", "GHI", "EFHI"
    };
    for (int i=0; i<9; i++)
    {
        mode[i]=0;
        for (char c='A'; c<='I'; c++)
        {
            mode[i] *= 10;
            if (strchr(modestr[i], c))
                mode[i] += 1;
        }
    }
    return 0;
}

int data2code(int data[])
{
    int result = 0;
    for (int i=0; i<9; i++)
        result = result * 10 + data[i];

    return result;
}

int code2data(int data[], int code)
{
    for (int i=8; i>=0; i--)
    {
        data[i] = code % 10;
        code /= 10;
    }
    return 0;
}

int change(int start, int modenum, int loop)
{
    int resultdata[9], modedata[9];
    code2data(modedata, modenum);
    code2data(resultdata, start);
    for (int i=0; i<loop; i++)
    {
        for (int j=0; j<9; j++)
            resultdata[j] = (resultdata[j]+modedata[j])%4;
    }
    return data2code(resultdata);
}

int dotry(int start, int step[], int n)
{
    if (start==0)
    {
        int stepcount=0;
        for (int i=0; i<n; i++)
        {
            stepcount +=step[i];

            /*for (int j=0; j<step[i]; j++)
                printf("%d ", i+1);
            */
        }
        if (stepcount<minstepcount)
        {
            minstepcount=stepcount;
            minstep[0]='\0';
            char tmp[2];
            tmp[1]='\0';
            for (int i=0; i<n; i++)
                for (int j=0; j<step[i]; j++)
                {
                    tmp[0]='0'+i+1;
                    strcat(minstep, tmp);
                }

        }

        return 0;
    }

    if (n==9)
    {
        return -1;
    }

    for (int i=0; i<4; i++)
    {
        step[n]=i;
        int result=change(start, mode[n], i);
        dotry(result, step, n+1);
    }
}

int main()
{
    int start;
    int data[9], step[9]={0};
    initmode();

    for (int i=0; i<9; i++)
        scanf("%d", &data[i]);
    start = data2code(data);

    dotry(start, step, 0);

    printf("%c", minstep[0]);
    for (int i=1; i<strlen(minstep); i++)
        printf(" %c", minstep[i]);
    printf("\n");
    return 0;
}
C++
1
https://gitee.com/se17a/c02.git
git@gitee.com:se17a/c02.git
se17a
c02
程序设计与算法二OJ题解
master

搜索帮助