Description
小张非常喜欢与朋友们玩成语接龙的游戏,但是作为“文化沙漠”的小张,成语的储备量有些不足。现在他的大脑中存储了
个成语,成语中的四个汉字都用一个1000000以内的正整数来表示。现在小张的同学为了考验他给出了他一个成语做开头和一个成语做结尾,如果小张能通过成语接龙的方式说到结尾的成语,他就能够成功完成游戏。他想知道最少能说几个成语能够成功完成游戏。
Input
第一行一个数
。
接下来
行,每行4个1000000以内的正整数,表示一个成语。
下一行4个1000000以内的正整数,表示开始成语。
下一行4个1000000以内的正整数,表示结束成语。
保证开始成语和结束成语在小张的成语储备之中。
Output
一行一个整数,表示最少说几个成语能够完成游戏。如果无法完成输出-1。
Notes
三个成语分别是(1,2,3,4)(4,5,6,7)(7,8,9,10)
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 300001
int list[N][4],visited[N];
int cmp(int a[],int b[])
{
int i;
for(i=0;i<4;i++){
if(a[i]!=b[i]) return 0;
}
return 1;
}
typedef struct Node{
int tail;
int id;
struct Node* next;
}NODE;
NODE graph[N];
struct Queue{
int num[N];
int step[N];
int front;
int rear;
}queue;
void init()
{
memset(visited,0,N);
memset(queue.num,-1,N);
memset(queue.step,-1,N);
queue.front=0;
queue.rear=0;
}
void push(int i,int step)
{
queue.num[queue.rear]=i;
queue.step[queue.rear++]=step;
}
int pop()
{
return queue.num[queue.front++];
}
main()
{
int m,i,j,a[4],b[4],start,end,last;
scanf("%d",&m);
for(i=0;i<m;i++){
for(j=0;j<4;j++){
scanf("%d",&list[i][j]);
}
NODE *t=(NODE*)malloc(sizeof(NODE));
t->tail=list[i][3];
t->id=i;
t->next=graph[list[i][0]].next;
graph[list[i][0]].next=t;
}
for(j=0;j<4;j++) scanf("%d",&a[j]);
for(j=0;j<4;j++) scanf("%d",&b[j]);
if(cmp(a,b)){
printf("1\n");
return 0;
}
if(a[3]==b[0]){
printf("2\n");
return 0;
}
for(i=0;i<m;i++){
if(cmp(list[i],a)){
visited[i]=1;
start=i;
push(i,1);
break;
}
}
for(i=0;i<m;i++){
if(cmp(list[i],b)){
end=i;
break;
}
}
init();
push(start,1);
while(1){
last=pop();
if(last==end) break;
if(last==-1){
printf("-1\n");
return 0;
}
NODE *t=graph[list[last][3]].next;
for(;t!=NULL;t=t->next){
if(visited[t->id]==1) continue;
push(t->id,queue.step[queue.front-1]+1);
visited[t->id]=1;
}
}
printf("%d\n",queue.step[queue.front-1]);
}