码迷,mamicode.com
首页 > 其他好文 > 详细

002:拨钟问题

时间:2018-05-24 21:55:05      阅读:288      评论:0      收藏:0      [点我收藏+]

标签:ace   names   break   bug   title   需要   空格   指针   输出   

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 


my version WA发的
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<map>
#include<cstdlib>
#include<cstring>
#define DEBUG(x) cout << #x << " = " << x << endl
using namespace std;
//二进制数枚举
short clocks[9];
short clocksTemp[9];
void copyClocks(short tar[],short src[]) {
    for(int i=0; i<9; i++) {
        clocksTemp[i]=clocks[i];
    }
}
bool areAllClear() {
    for(int i=0; i<9; i++) {
        if(clocksTemp[i]!=0)
            return false;
    }
    return true;
}
inline int getBit(int n,int i) {
    return (n>>i)&1;
}
char routs[9][9]= {"ABDE","ABC","BCEF"
                   ,"ADG","BDEFH","CFI"
                   ,"DEGH","GHI","EFHI"
                  };//todo
void movement(int i) {
    int N=strlen(routs[i]);
    for(int k=0; k<N; k++){
        int p=routs[i][k]-A;
        clocksTemp[p]=(clocksTemp[p]+1)%4;
    }
}
void debug(short a[],int n)
{
    for(int i=0;i<n;i++){
        printf("%d ",a[i]);
    }
    printf("\n");
}
vector<int> seq,seqt;
int main() {
    freopen("in.txt","r",stdin);
    for(int i=0; i<9; i++) {
        scanf("%d",&clocks[i]);
    }
//    printf("%d\n",(1<<9)-1);
    for(int i=0; i<(1<<9); i++) {
            //枚举操作序列,每个操作最多只有一次
        int times=0;
        seqt.clear();
        copyClocks(clocksTemp,clocks);
        for(int j=0; j<9; j++) {
                //获取操作序列
            if(getBit(i,j)) {
                movement(j);
                times++;
                seqt.push_back(j+1);
            }
        }
        if(areAllClear()){
            if(seq.size()==0)seq=seqt;
            else if(seq.size()>seqt.size()){
                seq=seqt;
            }
        }
    }
    for(int i=0;i<seq.size();i++){
        printf("%d",seq[i]);
        if(i!=seq.size()-1)printf(" ");
        else printf("\n");
    }
    return 0;
}

perfect version

#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<map>
#include<cstring>
#include<cstdlib>
#define DEBUG(x) cout << #x << " = " << x << endl
#define INF 0x3f3f3f3f
using namespace std;
int moveTimes[9]={0};
int resultTimes=INF;
int result[9];
int clocks[9],clocksTemp[9];
char routs[9][9]= {"ABDE","ABC","BCEF"
                   ,"ADG","BDEFH","CFI"
                   ,"DEGH","GHI","EFHI"
                  };//todo
void Enum(int p,int t)
{
    if(t>resultTimes)return;
    if(p>=9){
        int times=0;
        memcpy(clocksTemp,clocks,sizeof(clocksTemp));
        for(int i=0;i<9;i++){
//            times+=moveTimes[i];
            if(moveTimes[i])
            for(int j=0;routs[i][j];j++){
                clocksTemp[routs[i][j]-A]=(clocksTemp[routs[i][j]-A]
                                        +moveTimes[i])%4;
                times+=moveTimes[i];
            }
        }
        int i=0;
        for(;i<9;i++){
            if(clocksTemp[i])break;
        }
        if(i==9){
            if(resultTimes>times){
                resultTimes=times;
                memcpy(result,moveTimes,sizeof(result));
            }
        }
        return;
    }
    for(int i=0;i<4;i++){
        moveTimes[p]=i;
        Enum(p+1,t+i);
    }
    return;
}
int main()
{
//    freopen("in.txt","r",stdin);
    for(int i=0;i<9;i++){
        scanf("%d",&clocks[i]);
    }
    Enum(0,0);
    for(int i=0;i<9;i++){
        for(int j=0;j<result[i];j++){
            printf("%d ",i+1);
        }
    }
    return 0;
}

题意理解不准确。。。

002:拨钟问题

标签:ace   names   break   bug   title   需要   空格   指针   输出   

原文地址:https://www.cnblogs.com/MalcolmMeng/p/9085175.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!