Monday, April 25, 2011

10150 - Doublets


#include<iostream>
#include<cstring>
#include<map>
#include<vector>
#include<queue>
#include<cstdio>
#define M 25145
using namespace std;

char Dict[M][18];
int List[M][18],adjNo[M],path[M],N,length[M];
bool isAdjacent(char s1[],char s2[]);
int FindID(char[]);
bool BFS(int,int);
void PrintPath(int x,int y);

int main()
{
    char X[20],Y[20];
    bool status,f=true;

    int i=0,j,xid,yid,l;
    //freopen("in.txt","r",stdin);
    N=0;

    while(gets(Dict[N]))
    {
        for(i=0;Dict[N][i];i++);
        if(i==0)break;
        for(l=0;Dict[N][l];l++);
        length[N]=l;
        N++;
    }

    for(i=0;i<N;i++)
    {
        for(j=i+1;j<N;j++)
        {
            if(length[i]==length[j] && isAdjacent(Dict[i],Dict[j]))
            {
                List[i][adjNo[i]++]=j;
                List[j][adjNo[j]++]=i;
            }
        }
    }
           
   
    while(scanf("%s%s",X,Y)==2)
    {
        xid = FindID(X);
        yid = FindID(Y);

        if(length[xid]!=length[yid])
        {
            if(f)
                f=false;
            else
                printf("\n");
            printf("No solution.\n");
            continue;
        }
        status = false;

        status = BFS(xid,yid);

        if(f)
            f=false;
        else
            printf("\n");
       
        if(!status)
            printf("No solution.\n");
        else
            PrintPath(xid,yid);
    }       
    return 0;
}


bool isAdjacent(char s1[],char s2[])
{
    int i,k=0;
    for(i=0;s1[i];i++)
        if(s1[i]^s2[i])k++;
   
    if(k>=2)return false;
    return true;
}

int FindID(char word[])
{
    for(int i=0;i<N;i++)
        if(!strcmp(Dict[i],word))
            return i;
    return -1;
}

bool BFS(int x,int y)
{
    int i,h,t;
    int color[M];
    queue<int>Q;
    memset(color,0,sizeof(color));

    color[x]=1;Q.push(x);
    while(!Q.empty())
    {
        h=Q.front();Q.pop();

        for(i=0;i<adjNo[h];i++)
        {
            t=List[h][i];
            if(color[t]==0)
            {
                path[t]=h;
                color[t]=1;
                if(t==y)return true;
                Q.push(t);
            }
        }
    }
    return false;
}

void PrintPath(int x,int y)
{
    if(x==y)
    {
        printf("%s\n",Dict[x]);
        return;
    }
    PrintPath(x,path[y]);
    printf("%s\n",Dict[y]);
}

No comments:

Post a Comment

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