21.成语接龙

Description

小张非常喜欢与朋友们玩成语接龙的游戏,但是作为“文化沙漠”的小张,成语的储备量有些不足。现在他的大脑中存储了

m

个成语,成语中的四个汉字都用一个1000000以内的正整数来表示。现在小张的同学为了考验他给出了他一个成语做开头和一个成语做结尾,如果小张能通过成语接龙的方式说到结尾的成语,他就能够成功完成游戏。他想知道最少能说几个成语能够成功完成游戏。

Input

第一行一个数

m(1 \leq m \leq 300000 )

接下来

m

行,每行4个1000000以内的正整数,表示一个成语。

下一行4个1000000以内的正整数,表示开始成语。

下一行4个1000000以内的正整数,表示结束成语。

保证开始成语和结束成语在小张的成语储备之中。

Output

一行一个整数,表示最少说几个成语能够完成游戏。如果无法完成输出-1。

Notes

三个成语分别是(1,2,3,4)(4,5,6,7)(7,8,9,10)

测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. 5↵
  2. 1 2 3 4↵
  3. 4 5 6 7↵
  4. 7 8 9 10↵
  5. 4 6 6 1↵
  6. 1 6 8 8↵
  7. 1 2 3 4↵
  8. 7 8 9 10↵
以文本方式显示
  1. 3↵
1秒64M0
测试用例 2以文本方式显示
  1. 5↵
  2. 1 2 3 4↵
  3. 4 5 6 7↵
  4. 7 8 9 10↵
  5. 4 6 6 1↵
  6. 1 6 8 8↵
  7. 1 2 3 4↵
  8. 1 2 3 4↵
以文本方式显示
  1. 1↵
1秒64M0

#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]);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北辰2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值