zoukankan      html  css  js  c++  java
  • BZOJ1508 : [NOI2003]Game

    a[i][j]:i移动一根变成j是否可能

    b[i][j]:i增加一根变成j是否可能

    枚举在一个数字中移动的情况以及在两个数字中移动的情况

    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #define N 1010
    char s[N];int n,m,i,j,I,J,k,t,a[10][10],b[10][10],pow[8],v[N],w[N],e[N][8],l[N],pos;long long sum,tmp;
    void ok(){
      for(i=1;i<=pos;i++){
        if(i>1)putchar(w[i]==1?'+':'-');else if(w[i]!=1)putchar('-');
        for(j=l[i]-1;~j;j--)printf("%d",e[i][j]);
      }
      for(putchar('=');i<=n;i++){
        if(i>pos+1)putchar(w[i]==1?'-':'+');else if(w[i]==1)putchar('-');
        for(j=l[i]-1;~j;j--)printf("%d",e[i][j]);
      }
      putchar('#');
      std::exit(0);
    }
    int main(){
      for(pow[0]=i=1;i<8;i++)pow[i]=pow[i-1]*10;
      a[0][6]=a[0][9]=a[2][3]=a[3][2]=a[3][5]=a[5][3]=a[6][0]=a[6][9]=a[9][0]=a[9][6]=b[0][8]=b[1][7]=b[3][9]=b[5][6]=b[5][9]=b[6][8]=b[9][8]=1;
      scanf("%s",s+1),n=strlen(s+1);
      if(s[1]=='-')for(w[n=1]=-1,i=2;s[i]>='0'&&s[i]<='9';i++)(v[n]*=10)+=s[i]-'0',e[n][l[n]++]=s[i]-'0';
      else for(w[n=1]=i=1;s[i]>='0'&&s[i]<='9';i++)(v[n]*=10)+=s[i]-'0',e[n][l[n]++]=s[i]-'0';
      while(s[i]!='=')for(w[++n]=s[i++]=='+'?1:-1;s[i]>='0'&&s[i]<='9';i++)(v[n]*=10)+=s[i]-'0',e[n][l[n]++]=s[i]-'0';
      pos=n;
      if(s[++i]=='-')for(w[++n]=1,i++;s[i]>='0'&&s[i]<='9';i++)(v[n]*=10)+=s[i]-'0',e[n][l[n]++]=s[i]-'0';
      else for(w[++n]=-1;s[i]>='0'&&s[i]<='9';i++)(v[n]*=10)+=s[i]-'0',e[n][l[n]++]=s[i]-'0';
      while(s[i]!='#')for(w[++n]=s[i++]=='-'?1:-1;s[i]>='0'&&s[i]<='9';i++)(v[n]*=10)+=s[i]-'0',e[n][l[n]++]=s[i]-'0';
      for(i=1;i<=n;i++)for(sum+=v[i]*w[i],j=0,k=l[i]-1;j<k;j++,k--)t=e[i][j],e[i][j]=e[i][k],e[i][k]=t;
      for(i=1;i<=n;i++)for(j=0;j<l[i];j++)for(t=0;t<=9;t++)if(a[e[i][j]][t]){
        tmp=sum+w[i]*(t-e[i][j])*pow[j];
        if(!tmp)e[i][j]=t,ok();
      }
      for(i=1;i<=n;i++)for(j=0;j<l[i];j++)for(I=1;I<=n;I++)for(J=0;J<l[I];J++)if(!(i==I&&j==J))for(k=0;k<=9;k++)for(t=0;t<=9;t++)if(b[e[i][j]][k]&&b[t][e[I][J]]){
        tmp=sum+w[i]*(k-e[i][j])*pow[j]+w[I]*(t-e[I][J])*pow[J];
        if(!tmp)e[i][j]=k,e[I][J]=t,ok();
      }
      return puts("No"),0;
    }
    

      

  • 相关阅读:
    Servlet Filter过滤器执行顺序
    eclipse乱码问题
    如何查看servlet&jsp版本?
    Unity的shader学习2
    Unity的shader学习1
    后缀数组专题与代码模板
    哈希表/散列表 指针版模版
    图的连通性专题及模板
    一般图最大匹配--带花树
    7-15至7-17训练赛回顾
  • 原文地址:https://www.cnblogs.com/clrs97/p/4403173.html
Copyright © 2011-2022 走看看