zoukankan      html  css  js  c++  java
  • POJ 2286 The Rotation Game IDA*

    这里写图片描述
    这里写图片描述
    (再一次感谢学长幻灯片)
    ID A* 随便自己yy了一下。
    额嗯 思路什么的都没有问题 就是改不对。。
    无奈地删代码。。。边删边交。 删啊删
    哎呦 AC了
    。。。
    。。。
    。。。
    找删的那一段 。
    oh
    原来 d[i]^1!=f 要改成(d[i]^1)!=f 优先级问题 无奈了。。

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    char t,a[25],b[25],d[]={0,2,4,7,3,1,6,5},ch[]={7,8,9,12,13,16,17,18};
    char R[8][7]={{1,3,7,12,16,21,23},{23,21,16,12,7,3,1},{2,4,9,13,18,22,24},{24,22,18,13,9,4,2},{11,10,9,8,7,6,5},{5,6,7,8,9,10,11},{14,15,16,17,18,19,20},{20,19,18,17,16,15,14}};
    void r(int x){
        int jy=a[R[x][0]];
        for(char i=1;i<7;i++)a[R[x][i-1]]=a[R[x][i]];
        a[R[x][6]]=jy;
    }
    bool check(){
        for(int i=1;i<=7;i++)
            if(a[ch[i]]!=a[ch[0]])return 0;
        return 1;
    }
    char g(){
        char cnt[]={0,0,0};
        for(char i=0;i<=7;i++)cnt[a[ch[i]]-1]++;
        return 8-max(cnt[0],max(cnt[1],cnt[2]));
    }
    bool dfs(char f,char x){
        if(x>t)return 0;
        for(char i=0;i<8;i++)
            if((d[i]^1)!=f&&g()+x<=t+1){
                r(d[i]);
                b[x]=i+'A';
                if(check()||dfs(d[i],x+1))return 1;
                r(d[i]^1);
            }
        return 0;
    }
    int main(){
        while(scanf("%d",&a[1])&&a[1]){
            for(char i=2;i<=24;i++)scanf("%d",&a[i]);
            if(check()){printf("No moves needed
    %d
    ",a[ch[0]]);continue;}
            for(t=1;;t++)if(dfs(10,1))break;
            for(char i=1;i<=t;i++)printf("%c",b[i]);
            printf("
    %d
    ",a[ch[0]]);
        }
    }
    // by Sirius_Ren
    #include <cstdio>
    using namespace std;
    short t,a[25],b[25],d[]={0,2,4,7,3,1,6,5},ch[]={7,8,9,12,13,16,17,18};
    short R[8][7]={{1,3,7,12,16,21,23},{23,21,16,12,7,3,1},{2,4,9,13,18,22,24},{24,22,18,13,9,4,2},{11,10,9,8,7,6,5},{5,6,7,8,9,10,11},{14,15,16,17,18,19,20},{20,19,18,17,16,15,14}};
    void r(int x){int jy=a[R[x][0]];for(int i=1;i<7;i++)a[R[x][i-1]]=a[R[x][i]];a[R[x][6]]=jy;}
    short max(short a,short b,short c){int t=a>b?a:b;return t>c?t:c;}
    bool check(){for(int i=1;i<=7;i++)if(a[ch[i]]!=a[ch[0]])return false;return true;}
    short g(){
        int cnt[]={0,0,0};
        for(int i=0;i<=7;i++)cnt[a[ch[i]]-1]++;
        return 8-max(cnt[0],cnt[1],cnt[2]);
    }
    bool dfs(int f,int x){
        if(x>t)return false;
        for(int i=0;i<8;i++)
            if((d[i]^1)!=f&&g()+x<=t+1){
                r(d[i]);
                b[x]=i+'A';
                if(check()||dfs(d[i],x+1))return true;
                r(d[i]^1);
            }
        return false;
    }
    int main(){
        while(scanf("%d",&a[1])&&a[1]){
            for(int i=2;i<=24;i++)scanf("%d",&a[i]);
            if(check()){printf("No moves needed
    %d
    ",a[ch[0]]);continue;}
            for(t=1;;t++)if(dfs(10,1))break;
            for(int i=1;i<=t;i++)printf("%c",b[i]);
            printf("
    %d
    ",a[ch[0]]);
        }
    }

    这里写图片描述
    WA 的惨痛教训

    这里写图片描述

    最后一次AC 成功把code length刷到第一。
    这里写图片描述

  • 相关阅读:
    SQL的四种连接-左外连接、右外连接、内连接、全连接
    查看Linux下端口占用情况的命令
    linux的命令(1)
    xsheell的下载安装初级使用
    日交易,根据权重分配流量的算法,根据权重和交易笔数
    根据权重挑选通道的简单算法
    Java中的String与常量池
    JAVA虚拟机内存分配与回收机制
    JVM 内部运行线程介绍
    AspectJ切入点语法详解
  • 原文地址:https://www.cnblogs.com/SiriusRen/p/6532450.html
Copyright © 2011-2022 走看看