记录编号 432761 评测结果 AAAAA
题目名称 [CTSC 1999] 拯救大兵瑞恩 最终得分 100
用户昵称 GravatarCSU_Turkey 是否通过 通过
代码语言 C++ 运行时间 0.008 s
提交时间 2017-08-03 19:22:19 内存使用 35.72 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int n,m,p,a[16][16][1<<10],k,s,b[16][16],door[16][16][5],c[16][16][1<<10],h,mov[5][2];//1上2下3左4右
struct ghb{
	int x,y,now;
}e[5000000];
queue<int>S;
int main()
{
	freopen("rescue.in","r",stdin);
	freopen("rescue.out","w",stdout);
//	freopen("1.txt","r",stdin);
	mov[1][0]=0;
	mov[1][1]=1;
	mov[2][0]=0;
	mov[2][1]=-1;
	mov[3][0]=-1;
	mov[3][1]=0;
	mov[4][0]=1;
	mov[4][1]=0;
	scanf("%d%d%d%d",&n,&m,&p,&k);
	memset(a,-1,sizeof(a));
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
	for(int o=0;o<(1<<p);o++){
		a[i][j][o]=0;
		c[i][j][o]=++h;
		e[h].x=i;
		e[h].y=j;
		e[h].now=o;
	}
	memset(door,-1,sizeof(door));
	for(int i=1;i<=k;i++){
		int x1,x2,y1,y2,g;
		scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&g);
		int tem1=x1-x2;
		int tem2=y1-y2;
		if(!tem1){
			if(tem2==1){
				door[x1][y1][2]=g;
				door[x2][y2][1]=g;
			}
			if(tem2==-1){
				door[x1][y1][1]=g;
				door[x2][y2][2]=g;
			}
		}
		if(!tem2){
			if(tem1==1){
				door[x1][y1][3]=g;
				door[x2][y2][4]=g;
			}
			if(tem1==-1){
				door[x1][y1][4]=g;
				door[x2][y2][3]=g;
			}
		}
	}
	scanf("%d",&s);
	for(int i=1;i<=s;i++){
		int x,y,q;
		scanf("%d%d%d",&x,&y,&q);
		b[x][y]|=(1<<(q-1));
	}
	S.push(c[1][1][0]);
	while(!S.empty()){
		int u=S.front();
		S.pop();
		for(int i=1;i<=4;i++){
			int x=e[u].x+mov[i][0];
			int y=e[u].y+mov[i][1];
			int now=e[u].now;
			if(b[x][y]>0)
			now=now|b[x][y];
			if(!a[x][y][now]){
				if(door[e[u].x][e[u].y][i]==-1){
					a[x][y][now]=a[e[u].x][e[u].y][e[u].now]+1;
					S.push(c[x][y][now]);
				}
				else
				if(door[e[u].x][e[u].y][i]>0){
					if(e[u].now&(1<<(door[e[u].x][e[u].y][i]-1))){
						a[x][y][now]=a[e[u].x][e[u].y][e[u].now]+1;
						S.push(c[x][y][now]);
					}
				}
			}
		}
	}
	int mi=0x3fffffff;
	for(int i=0;i<(1<<p);i++){
		if(a[n][m][i])
		mi=min(mi,a[n][m][i]);
	}
	if(mi!=0x3fffffff)
	cout<<mi;
	else 
	cout<<-1;
	return 0;
}