d[i][j][k]代表在(i,j)这个坐标点,钥匙集合为二进制k的最短路。
跑一遍Dijkstra即可。
#includeusing namespace std;const int N=15;const int dx[]={-1,0,1,0};const int dy[]={ 0,1,0,-1};const int INF=0x3f3f3f3f;int n,m,k,mp[110][110];vector ys[110];struct node{ int x,y,ys; int d; node() {} node(int x,int y,int ys,int d) : x(x),y(y),ys(ys),d(d) {} bool operator < (const node &rhs) const { return d>rhs.d; }};int id(int x,int y) { return (x-1)*m+y; }int d[N][N][1<<12]; bool vis[N][N][1<<12];priority_queue q;int Dijkstra() { int ret=INF; memset(d,0x3f,sizeof(d)); memset(vis,0,sizeof(vis)); int tmp=0; for (int i=0;i n || ny<1 || ny>m || mp[id(u.x,u.y)][id(nx,ny)]==0) continue; if (mp[id(u.x,u.y)][id(nx,ny)]>0 && !(u.ys&(1<