• HDU1667 : The Rotation Game


    考虑枚举最后中间的数字,然后可以用一个24位的整数来表示一个状态,一共有C(24,8)=735471种状态,然后BFS即可。

    比赛的时候由于手速问题没写完TAT

    写完后在坑爹评测机上还是TLE。

    所以这是经过大量常数优化后的代码。

    #include<cstdio>
    struct P{int a,b,c,d;P(){}P(int _a,int _b,int _c,int _d){a=_a,b=_b,c=_c,d=_d;}}q[800000],x;
    bool v[1<<24];
    int i,j,k,S,a[24],ans,op[800000],mid,now[800000],h,t,Case;
    void solve(int num){
      for(i=S=0;i<24;i++)if(a[i]==num)S|=1<<i;
      if(S==235968){
        if(ans)ans=0,mid=num;
        return;
      }
      v[S]=1,q[h=t=1]=P(S,0,0,0);
      while(h<=t){
        x=q[h],x.b++,x.d=h++;
        if(x.b>ans)break;
        int U=x.a;
        S=(U&11499450)|(U>>2&1)|((U>>6&1)<<2)|((U>>11&1)<<6)|((U>>15&1)<<11)|((U>>20&1)<<15)|((U>>22&1)<<20)|((U&1)<<22);
        if(!v[S]){
          q[++t]=P(S,x.b,0,x.d),v[S]=1;
          if(S==235968)break;
        }
        S=(U&6156021)|((U>>3&1)<<1)|((U>>8&1)<<3)|((U>>12&1)<<8)|((U>>17&1)<<12)|((U>>21&1)<<17)|((U>>23&1)<<21)|((U>>1&1)<<23);
        if(!v[S]){
          q[++t]=P(S,x.b,1,x.d),v[S]=1;
          if(S==235968)break;
        }
        S=(U&16775183)|((U&1008)<<1)|((U>>10&1)<<4);
        if(!v[S]){
          q[++t]=P(S,x.b,2,x.d),v[S]=1;
          if(S==235968)break;
        }
        S=(U&15736831)|((U&516096)<<1)|((U>>19&1)<<13);
        if(!v[S]){
          q[++t]=P(S,x.b,3,x.d),v[S]=1;
          if(S==235968)break;
        }
        S=(U&6156021)|((U>>21&1)<<23)|((U>>17&1)<<21)|((U>>12&1)<<17)|((U>>8&1)<<12)|((U>>3&1)<<8)|((U>>1&1)<<3)|((U>>23&1)<<1);
        if(!v[S]){
          q[++t]=P(S,x.b,4,x.d),v[S]=1;
          if(S==235968)break;
        }
        S=(U&11499450)|((U>>20&1)<<22)|((U>>15&1)<<20)|((U>>11&1)<<15)|((U>>6&1)<<11)|((U>>2&1)<<6)|((U&1)<<2)|(U>>22&1);
        if(!v[S]){
          q[++t]=P(S,x.b,5,x.d),v[S]=1;
          if(S==235968)break;
        }
        S=(U&15736831)|((U&1032192)>>1)|((U>>13&1)<<19);
        if(!v[S]){
          q[++t]=P(S,x.b,6,x.d),v[S]=1;
          if(S==235968)break;
        }
        S=(U&16775183)|((U&2016)>>1)|((U>>4&1)<<10);
        if(!v[S]){
          q[++t]=P(S,x.b,7,x.d),v[S]=1;
          if(S==235968)break;
        }
      }
      for(i=1;i<=t;i++){
        if(q[i].a==235968){
          if(q[i].b<ans){
            ans=q[i].b;
            for(j=ans,k=i;j;j--,k=q[k].d)op[j]=q[k].c;
            mid=num;
          }else if(q[i].b==ans){
            for(j=ans,k=i;j;j--,k=q[k].d)now[j]=q[k].c;
            int flag=0;
            for(j=1;j<=ans;j++)if(op[j]!=now[j]){
              if(op[j]>now[j])flag=1;
              else flag=0;
              break;
            }
            if(flag){
              for(j=1;j<=ans;j++)op[j]=now[j];
              mid=num;
            }
          }
        }
        v[q[i].a]=0;
      }
    }
    int main(){
      while(~scanf("%d",&a[0])){
        if(!a[0])return 0;
        for(i=1;i<24;i++)scanf("%d",&a[i]);
        ans=~0U>>1;
        solve(2),solve(1),solve(3);
        if(!ans)puts("No moves needed");else{
          for(i=1;i<=ans;i++)putchar(op[i]+'A');
          puts("");
        }
        printf("%d
    ",mid);
      }
    }
    

      

  • 相关阅读:
    java 后端博客系统文章系统——No5
    啃碎并发(11):内存模型之重排序
    java 后端博客系统文章系统——No4
    啃碎并发(10):内存模型之内部原理
    java 后端博客系统文章系统——No3
    啃碎并发(九):内存模型之基础概述
    啃碎并发(八):深入分析wait&notify原理 猿码架构
    快速平方根倒数算法
    查找:哈希表
    注意力机制论文 --- Crop leaf disease recognition based on Self-Attention convolutional neural network
  • 原文地址:https://www.cnblogs.com/clrs97/p/4634072.html
Copyright © 2020-2023  润新知