#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.