程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 11198 - Dancing Digits

11198 - Dancing Digits

編輯:C++入門知識

[cpp]   描述:坑人的一道題,不過也不難,就是數字交換,只有一正一負的數字才存在交換,並且交換之後不能形成素數   #include <cstdio>   #include <cstdlib>   #include <cstring>   #define N 1000003   int t[10]= {1,2,3,4,5,6,7,8},cmp[]= {4,6,8,9,10,12,14,15};   int head[N],next[N],count[N];   int str[N][10][2];   int m=1,sum,flag;   int hash(int (*p)[2])   {       int x=0;       for(int i=0; i<8; i++)           x=(x*10+p[i][0])%N;       return x;   }   bool insert(int x,int rear)   {       int c=head[x];       while(c!=-1)       {           int z=0;           for(int i=0; i<8; i++)               if(str[rear][i][0]!=str[c][i][0])               {                   z=1;                   break;               }           if(z) c=next[c];           else return false;       }       next[rear]=head[x];       head[x]=rear;       return true;   }   void bfs()   {       memset(head,-1,sizeof(head));       memset(next,-1,sizeof(next));       memset(count,0,sizeof(count));       flag=0;       int rear=1,front=0;       while(front<rear&&rear<N)       {           for(int i=0; i<8; i++)               for(int j=0; j<8; j++)                   if(str[front][j][1]+str[front][i][1]==1)                   {                       int c=0;                       for(int k=0; k<8; k++) if(str[front][i][0]+str[front][j][0]==cmp[k])                           {                               c=-1;                               break;                           }                       if(c!=-1)//前插                       {                           if(j>i)                           {                               for(int k=0; k<i; k++)                               {                                   str[rear][k][0]=str[front][k][0];                                   str[rear][k][1]=str[front][k][1];                               }                               for(int k=j; k<8; k++)                               {                                   str[rear][k][0]=str[front][k][0];                                   str[rear][k][1]=str[front][k][1];                               }                               for(int k=i; k<j-1; k++)                               {                                   str[rear][k][0]=str[front][k+1][0];                                   str[rear][k][1]=str[front][k+1][1];                               }                               str[rear][j-1][0]=str[front][i][0];                               str[rear][j-1][1]=str[front][i][1];                           }                           else                           {                               for(int k=0; k<j; k++)                               {                                   str[rear][k][0]=str[front][k][0];                                   str[rear][k][1]=str[front][k][1];                               }                               for(int k=i+1; k<8; k++)                               {                                   str[rear][k][0]=str[front][k][0];                                   str[rear][k][1]=str[front][k][1];                               }                               for(int k=i; k>j; k--)                               {                                   str[rear][k][0]=str[front][k-1][0];                                   str[rear][k][1]=str[front][k-1][1];                               }                               str[rear][j][0]=str[front][i][0];                               str[rear][j][1]=str[front][i][1];                           }                           for(int k=0; k<8; k++) if(str[rear][k][0]!=t[k])                               {                                   flag=1;                                   break;                               }                           if(!flag)                           {                               sum=count[front]+1;                               return;                           }                           else                           {                               flag=0;                               int x=hash(str[rear]);                               if(insert(x,rear))                               {                                   count[rear]=count[front]+1;                                   rear++;                               }                           }                       }                       if(c!=-1)//後插                       {                           if(j>i)                           {                               for(int k=0; k<i; k++)                               {                                   str[rear][k][0]=str[front][k][0];                                   str[rear][k][1]=str[front][k][1];                               }                               for(int k=j+1; k<8; k++)                               {                                   str[rear][k][0]=str[front][k][0];                                   str[rear][k][1]=str[front][k][1];                               }                               for(int k=i; k<j; k++)                               {                                   str[rear][k][0]=str[front][k+1][0];                                   str[rear][k][1]=str[front][k+1][1];                               }                               str[rear][j][0]=str[front][i][0];                               str[rear][j][1]=str[front][i][1];                           }                           else                           {                               for(int k=0; k<=j; k++)                               {                                   str[rear][k][0]=str[front][k][0];                                   str[rear][k][1]=str[front][k][1];                               }                               for(int k=i+1; k<8; k++)                               {                                   str[rear][k][0]=str[front][k][0];                                   str[rear][k][1]=str[front][k][1];                               }                               for(int k=i; k>j+1; k--)                               {                                   str[rear][k][0]=str[front][k-1][0];                                   str[rear][k][1]=str[front][k-1][1];                               }                               str[rear][j+1][0]=str[front][i][0];                               str[rear][j+1][1]=str[front][i][1];                           }                           for(int k=0; k<8; k++) if(str[rear][k][0]!=t[k])                               {                                   flag=1;                                   break;                               }                           if(!flag)                           {                               sum=count[front]+1;                               return;                           }                           else                           {                               flag=0;                               int x=hash(str[rear]);                               if(insert(x,rear))                               {                                   count[rear]=count[front]+1;                                   rear++;                               }                           }                       }                   }           front++;       }   }   int main()   {       // freopen("a.txt","r",stdin);       while(scanf("%d",&str[0][0][0])!=EOF)       {           if(!str[0][0][0]) break;           flag=0;           sum=-1;           if(str[0][0][0]>0) str[0][0][1]=1;           else           {               str[0][0][1]=0;               str[0][0][0]=-str[0][0][0];           }           for(int i=1; i<8; i++)           {               scanf("%d",&str[0][i][0]);               if(str[0][i][0]>0) str[0][i][1]=1;               else               {                   str[0][i][1]=0;                   str[0][i][0]=-str[0][i][0];               }           }  www.2cto.com         for(int i=0; i<8; i++)               if(str[0][i][0]!=t[i])               {                   flag=1;                   break;               }           if(flag)           {               bfs();               printf("Case %d: %d\n",m++,sum);           }           else printf("Case %d: 0\n",m++);       }       return 0;   }    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved