您的位置:首页 > 其它

UVaOJ 112道题目-字符串

2014-11-18 15:49 260 查看
1、110301/10082 WERTYU (WERTYU 键盘)

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<ctype.h>
#include<queue>
using namespace std;
char word[26000][20];
int h[26000];
int nxt[1000000];
int node[1000000];
int vis[26000];
int dis[26000];
int cnt=0;
int q[26000];
int pre[26000];
int route[26000];
int GetInd(char src[])
{
for(int i=0;i<cnt;i++)
{
if(strcmp(src,word[i])==0)return i;
}
return -1;
}
int _strcmp(char src[],char dest[],int len)
{
int tot=0;
for(int i=0;i<len;i++)
if(src[i]!=dest[i])tot++;
return tot;
}
void solve(int s,int e)
{
vis[s]=1;
dis[s]=0;
int i,front=0,rear=1,lev=1,end=rear,tot=0;
q[front]=s;
while(front<rear)
{
int x=q[front];
front++;
for(i=h[x];i!=-1;i=nxt[i])
{
int y=node[i];
if(dis[y]==-1)
{
dis[y]=lev;
pre[y]=x;
if(y==e)
{
int t=y;
tot=0;
while(1)
{
route[tot++]=t;
if(t==s)break;
t=pre[t];
}
for(tot=tot-1;tot>=0;tot--)printf("%s\n",word[route[tot]]);
return;
}
q[rear]=y;
rear++;
}
}
if(front==end)
{
lev++;
end=rear;
}
}
printf("No solution.\n");
}
int main()
{
char src[20],dest[20];
int T=0,i,tot=0;
memset(h,-1,sizeof(h));
memset(nxt,-1,sizeof(nxt));
while(gets(word[cnt])!=NULL)
{
if(word[cnt][0]=='\0')
break;
int la=strlen(word[cnt]);
for(i=0;i<cnt;i++)
{
int lb=strlen(word[i]);
if(la!=lb)continue;
if(_strcmp(word[i],word[cnt],la)==1)
{
node[tot]=cnt;
nxt[tot]=h[i];
h[i]=tot;
tot++;
node[tot]=i;
nxt[tot]=h[cnt];
h[cnt]=tot;
tot++;
}
}
cnt++;
}
while(scanf("%s",src)!=EOF)
{
scanf("%s",dest);
if(T)printf("\n");
memset(vis,0,sizeof(vis));
memset(dis,-1,sizeof(dis));
memset(pre,-1,sizeof(pre));
int sta=GetInd(src);
int end=GetInd(dest);
if(sta==-1||end==-1)
{
printf("No solution.\n");
continue;
}
solve(sta,end);
T++;
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: