Friday, April 22, 2011

429 - Word Transformation

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#define M 205
using namespace std;

char Dict[M][15];
int List[M][M],N;

int BFS(int,int);
int FindID(char[]);
bool IsAdj(char[],char[]);

int main()
{
    int t,i,j,k,x,y,steps;
    char word[30],X[15],Y[15];
    //freopen("in.txt","r",stdin);
    scanf("%d\n\n",&t);

    while(t--)
    {
        N=0;memset(List,0,sizeof(List));
        while(gets(Dict[N])&&strcmp(Dict[N],"*"))N++;

        for(i=0;i<N;i++)
            for(j=i+1;j<N;j++)
                if(IsAdj(Dict[i],Dict[j]))
                    List[i][j]=List[j][i]=1;
        while(gets(word))
        {
            for(k=0;word[k];k++);
            if(!k)break;

            sscanf(word,"%s%s",X,Y);
            x=FindID(X);
            y=FindID(Y);

            steps=BFS(x,y);
            printf("%s %s %d\n",X,Y,steps);
        }
        if(t)printf("\n");
    }
    return 0;
}

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

bool IsAdj(char X[],char Y[])
{
    int x,y,i;

    for(x=0;X[x];x++);
    for(y=0;Y[y];y++);
    if(x!=y)return false;

    x=0;
    for(i=0;i<y;i++)
        if(X[i]!=Y[i])x++;

    if(x>1)return false;
    return true;
}

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

    color[x]=1,d[x]=0;
    Q.push(x);

    while(!Q.empty())
    {
        h=Q.front();
        Q.pop();

        for(i=0;i<N;i++)
        {
            if(List[h][i]&&color[i]==0)
            {
                color[i]=1;
                d[i]=d[h]+1;
                if(i==y)break;
                Q.push(i);
            }
        }
        if(i==y)break;
    }
    return d[y];
}

No comments:

Post a Comment

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