题目链接:https://www.luogu.com.cn/problem/P4011
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=21,M=1<<15; 4 const int dx[11]={1,-1,0,0},dy[11]={0,0,1,-1}; 5 int n,m,p,T,S; 6 int g[N][N][N][N],cnt[N][N],key[N][N][N]; 7 bool vis[N][N][M]; 8 9 struct Node { 10 int x,y,k,d; 11 Node() { x=y=k=d=0; } 12 Node(int _x,int _y,int _k,int _d) { 13 x=_x,y=_y,k=_k,d=_d; 14 } 15 }; 16 17 inline int re_ad() { 18 char ch=getchar(); int x=0,f=1; 19 while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); } 20 while('0'<=ch && ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar(); 21 return x*f; 22 } 23 24 int get_key(int x,int y) { 25 int res=0; 26 for(int i=1;i<=cnt[x][y];++i) res|=(1<<(key[x][y][i]-1)); 27 return res; 28 } 29 30 int bfs(int sx,int sy) { 31 queue<Node> q; 32 int sk=get_key(sx,sy); 33 q.push(Node{sx,sy,sk,0}); 34 vis[sx][sy][sk]=true; 35 while(!q.empty()) { 36 Node u=q.front(); q.pop(); 37 if(u.x==n && u.y==m) return u.d; 38 int ux=u.x,uy=u.y,uk=u.k,ud=u.d; 39 for(int i=0,vx,vy,vk,opt;i<4;++i) { 40 vx=ux+dx[i],vy=uy+dy[i],opt=g[ux][uy][vx][vy]; 41 if(opt==-1) continue; 42 if(vx<1 || vx>n || vy<1 || vy>m) continue; 43 if(opt && !(uk&(1<<(opt-1)))) continue; 44 if(vx<1||vx>n||vy<1||vy>m||opt<0||(opt&&!(u.k&(1<<(opt-1))))) continue; 45 vk=uk|get_key(vx,vy); 46 if(!vis[vx][vy][vk]) q.push(Node{vx,vy,vk,ud+1}),vis[vx][vy][vk]=true; 47 } 48 } 49 return -1; 50 } 51 52 int main() 53 { 54 n=re_ad(),m=re_ad(),p=re_ad(),T=re_ad(); 55 for(int t=1,x,y,xx,yy,G;t<=T;++t) { 56 x=re_ad(),y=re_ad(),xx=re_ad(),yy=re_ad(),G=re_ad(); 57 if(G) g[x][y][xx][yy]=g[xx][yy][x][y]=G; 58 else g[x][y][xx][yy]=g[xx][yy][x][y]=-1; 59 } 60 S=re_ad(); 61 for(int s=1,x,y,q;s<=S;++s) { 62 x=re_ad(),y=re_ad(),q=re_ad(); 63 key[x][y][++cnt[x][y]]=q; 64 } 65 printf("%d\n",bfs(1,1)); 66 return 0; 67 }