Sunday, March 27, 2011

11730 - Number Transformation


#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#define M 1005
#define N 505
using namespace std;

int adjacent[M][N],adjNo[M];
bool prime[M],visited[M];

void loadAdj();
int main()
{
    int i,s,t,clr[M],d[M],h,x,f,k=1;
    queue<int>Q;
    //freopen("in.txt","r",stdin);
    loadAdj();

    while(scanf("%d%d",&s,&t)==2 &&(s+t))
    {
        if(s==t)
        {
            printf("Case %d: %d\n",k++,0);
            continue;
        }
        for(i=s;i<=t;i++)
            clr[i]=0,d[i]=M;
        for(i=s;i<=t;i++)
            visited[i]=false;

        clr[s]=1,f=0,d[s]=0;
        Q.push(s);

        while(!Q.empty())
        {
            h=Q.front();
            for(i=0;i<adjNo[h];i++)
            {
                x=adjacent[h][i];
                if(x>t || visited[x])continue;
                visited[x]=true;
                if(clr[x]==0)
                    clr[x]=1,d[x]=d[h]+1;
                Q.push(x);
               
                if(x==t)
                {
                    f=1;
                    goto END;
                }
            }
            Q.pop();
            clr[h]=2;
        }
END:
        if(f)
            printf("Case %d: %d\n",k++,d[x]);
        else
            printf("Case %d: %d\n",k++,-1);
        while(!Q.empty())
            Q.pop();
    }
    return 0;
}

void loadAdj()
{
    int i,j,s=M/2;
    for(i=2;i<M;i++)
        prime[i]=true;
    for(i=0;i<N;i++)
        adjNo[i]=0;

    for(i=2;i<=s;i++)
    {
        if(prime[i])
            for(j=i+i;j<M;j=j+i)
            {
                prime[j]=false;
                adjacent[j][adjNo[j]++]=j+i;
            }
    }
}

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.