zoukankan      html  css  js  c++  java
  • UVA 1343 The Rotation Game

    The Rotation Game

    题意:

    ‘#’型棋盘上有8个1,8个2,8个3,可以往8个方向旋转

    问中间8个格数字相同的最少旋转次数

    输出字典序最小的方案数,并输出中间是哪个数

    #include<cstdio>
    #include<algorithm>
    
    using namespace std;
    
    int mov[8][7]={
        0,2,6,11,15,20,22,
        1,3,8,12,17,21,23,
        10,9,8,7,6,5,4,
        19,18,17,16,15,14,13,
        23,21,17,12,8,3,1,
        22,20,15,11,6,2,0,
        13,14,15,16,17,18,19,
        4,5,6,7,8,9,10
    };
    int pos[8]={6,7,8,11,12,15,16,17}; 
    int rev[8]={5,4,7,6,1,0,3,2}; 
    int a[24];
    int maxd;
    char order[10001];
    int judge(int x){
        int sum=0;
        for(int i=0;i<8;i++)
            if(a[pos[i]]!=x) sum++;
        return sum;
    }
    int h(){
        return min(judge(1),min(judge(2),judge(3)));
    }
    void move(int i){
        int t=a[mov[i][0]];
        for(int j=0;j<6;j++)
            a[mov[i][j]]=a[mov[i][j+1]];
        a[mov[i][6]]=t;
    }
    bool dfs(int d){
        if(!judge(a[pos[0]])){
            order[d]='';
            puts(order);
            return true;
        }
        if(d+h()>maxd) return false;
        for(int i=0;i<8;i++){
            move(i);
            order[d]=char(i+'A');
            if(dfs(d+1)) return true;
            move(rev[i]);
        }
        return false;
    } 
    int main(){
        while(1){
            scanf("%d",&a[0]);
            if(!a[0])    return 0;
            for(int i=1;i<24;i++)    scanf("%d",&a[i]);
            if(!judge(a[pos[0]]))    puts("No moves needed");
            else    for(maxd=1;;maxd++)    if(dfs(0)) break;
            printf("%d
    ",a[6]);
        }
    }
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    localStorage溢出问题
    面试题梳理
    灵活的楼梯导航条代码
    日期初始化
    css 控制横向布局,超出隐藏,滚动
    自定义滚动条样式
    jquery源码之JQ对象
    jqeury源码之变量解析
    jquery源码之通篇概要
    工作站流处理
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/7689501.html
Copyright © 2011-2022 走看看