记录编号 210847 评测结果 AAAAA
题目名称 [CTSC 1999] 拯救大兵瑞恩 最终得分 100
用户昵称 Gravatar神利·代目 是否通过 通过
代码语言 C++ 运行时间 0.020 s
提交时间 2015-11-29 11:20:59 内存使用 15.55 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
int N,M,P,K;
int a[4]={0,0,1,-1},b[4]={1,-1,0,0};
int d[2100][20][20];
int o[20][20][20][20];
int flag[20][20];
void clear()
{
	memset(o,-1,sizeof(o));
	memset(d,0x3f,sizeof(d));
}
int x,y,u,v,g,s,tip;
void init()
{
	clear();
	scanf("%d%d%d",&N,&M,&P);
	scanf("%d",&K);
	for(int i=0;i<K;++i)
	{
		scanf("%d%d%d%d",&x,&y,&u,&v);
		scanf("%d",&o[x][y][u][v]);
		o[u][v][x][y]=o[x][y][u][v];
	}
	scanf("%d",&s);
	for(int i=0;i<s;++i)
	{
		scanf("%d%d",&x,&y);
		scanf("%d",&tip);
		if(tip)
			flag[x][y]|=1<<tip;
	}
}
struct que
{
	int now,x,y;
}q[1000100];
int l,r,now;
void spfa()
{
	q[0].x=1;
	q[0].y=1;
	if(flag[1][1])
		q[0].now=1<<flag[1][1];
	d[q[0].now][1][1]=0;
	while(l<=r)
	{
		x=q[l].x;
		y=q[l].y;
		now=q[l++].now;
		for(int i=0;i<4;++i)
		{
			u=x+a[i];
			v=y+b[i];
			if(u&&v&&u<=N&&v<=M&&(o[x][y][u][v]<0||now&(1<<o[x][y][u][v])))
			{
				if(d[now][u][v]>d[now][x][y]+1)
				{
					d[now][u][v]=d[now][x][y]+1;
					q[++r].x=u;
					q[r].y=v;
					q[r].now=now;
					if(flag[u][v])
					{
						d[now|flag[u][v]][u][v]=d[now][x][y]+1;
						q[r].now|=flag[u][v];
					}
				}
			}
		}
	}
}
int main()
{
	freopen("rescue.in","r",stdin);
	freopen("rescue.out","w",stdout);
	init();
	spfa();
	int ans=0x7fffffff;
	for(int i=0;i<2050;++i)
		if(d[i][N][M]<ans)
		    ans=d[i][N][M];
	if(ans>1e6)
	    puts("-1");
	else
	    printf("%d",ans);
	getchar();
	getchar();
	getchar();
	getchar();
}