标签:style blog http io color ar os for sp
#include<iostream> #include<cstdio> #include<queue> using namespace std; const int NO=56; const int INF=1000000000; struct X { int x,y; int key; }dir[]={{-1,0}/*¡ü*/,{0,1}/*¡ú*/,{1,0}/*¡ý*/,{0,-1}/*¡û*/},a,b; int n,m,q; int MAP[NO][NO][NO][NO]; int key[NO][NO]; int step[NO][NO][1024]; void reset_step() { for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) for(int k=0;k<1<<q;k++) step[i][j][k]=INF; } int bfs() { reset_step(); queue<X> t; a.x=a.y=1; a.key=0; step[a.x][a.y][a.key]=0; t.push(a); while(!t.empty()) { a=t.front(); t.pop(); if(a.x==n&&a.y==m) return step[a.x][a.y][a.key]; for(int i=0;i<4;i++) { b.x=a.x+dir[i].x; b.y=a.y+dir[i].y; if((MAP[a.x][a.y][b.x][b.y]&a.key)==MAP[a.x][a.y][b.x][b.y]) { b.key=a.key|key[b.x][b.y]; if(step[b.x][b.y][b.key]==INF) { step[b.x][b.y][b.key]=step[a.x][a.y][a.key]+1; t.push(b); } } } } return -1; } int main() { while(scanf("%d%d%d",&n,&m,&q)==3) { for(int i=1;i<=n;i++) { MAP[i][0][i][1]=MAP[i][1][i][0]=1<<q; MAP[i][m][i][m+1]=MAP[i][m+1][i][m]=1<<q; } for(int j=1;j<=m;j++) { MAP[0][j][1][j]=MAP[1][j][0][j]=1<<q; MAP[n][j][n+1][j]=MAP[n+1][j][n][j]=1<<q; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { key[i][j]=0; for(int x=1;x<=n;x++) for(int y=1;y<=m;y++) MAP[i][j][x][y]=MAP[x][y][i][j]=0; } int k; scanf("%d",&k); int a,b,c,d,e; while(k--) { scanf("%d%d%d%d%d",&a,&b,&c,&d,&e); if(e==0) e=1<<q; else e=1<<(e-1); MAP[a][b][c][d]=MAP[c][d][a][b]=e; } scanf("%d",&k); while(k--) { scanf("%d%d%d",&a,&b,&c); key[a][b]|=1<<(c-1); } printf("%d\n",bfs()); } return 0; }
标签:style blog http io color ar os for sp
原文地址:http://www.cnblogs.com/Lnizei/p/4072125.html