记录编号 236823 评测结果 AAAAA
题目名称 [CTSC 1999] 拯救大兵瑞恩 最终得分 100
用户昵称 Gravatar粘粘自喜 是否通过 通过
代码语言 C++ 运行时间 0.096 s
提交时间 2016-03-15 18:04:23 内存使用 0.57 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define inf 210000000
int n,m,p,K,S,map[16][16][16][16],ans,own[11]={0},use[16][16]={0};
int xi[4]={-1,0,0,1},yi[4]={0,-1,1,0};
bool key[16][16][11]={0};
void dfs(int x,int y,int z,int lx,int ly)
{
    int i,j,xx,yy;
    bool ff=false;
    if(x==n&&y==m){
        ans=min(ans,z);
        return ;
    }
    if((use[x][y]>5)||(z+n+m-x-y>=ans)) return ;
    for(i=1;i<=p;++i)
      if(key[x][y][i]){
        own[i]+=1;
        ff=true;
      }
    for(i=0;i<=3;++i){
        xx=x+xi[i];yy=y+yi[i];
        if(xx==lx&&yy==ly&&!ff) continue;
        if(xx>0&&xx<=n&&yy>0&&yy<=m){
            if(map[x][y][xx][yy]<0||own[map[x][y][xx][yy]]){
                use[xx][yy]+=1;
                dfs(xx,yy,z+1,x,y);
                use[xx][yy]-=1;
            }
        }
    }
    for(i=1;i<=p;++i)
      if(key[x][y][i])
        own[i]-=1;
}
int main()
{
    freopen("rescue.in","r",stdin);
    freopen("rescue.out","w",stdout);
    int i,j,x1,y1,x2,y2,x,y,z;
    scanf("%d%d%d%d",&n,&m,&p,&K);
    memset(map,128,sizeof(map));
    for(i=1;i<=K;++i){
        scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&z);
        map[x1][y1][x2][y2]=map[x2][y2][x1][y1]=z;
    }
    scanf("%d",&S);
    for(i=1;i<=S;++i){
        scanf("%d%d%d",&x,&y,&z);
        key[x][y][z]=true;
    }
    ans=inf;
    dfs(1,1,0,0,0);
    ans=(ans==inf?-1:ans);
    printf("%d\n",ans);
}