rt.
#include<iostream>
#include<map>
using namespace std;
struct wall {
int X1,Y1,X2,Y2,G;
} walls[160];
struct key {
int X1,Y1,Q;
} keys[60];
struct point {
int X,Y;
map<int,int> enableKey;
friend bool operator < (point a,point b) {
if(a.X>b.X) return 1;
if(a.X<b.X) return 0;
if(a.Y>b.Y) return 1;
if(a.Y<b.Y) return 0;
return a.enableKey<b.enableKey;
}
};
int N,M,P,K,S,sx,sy,tx,ty;
int dx[4] = {0,-1,0,1};
int dy[4] = {-1,0,1,0};
int mp[15][15][60] = {{0}};
map<point,int> vis;
map<int,int> enableKey;
int dfs(int x, int y, int step) {
if(x==tx&&y==ty)
return step;
int ret = 2147483647;
// cout << x << " " << y << "=====================\n";
for (int i = 0,flag = 0; i < 4; i++,flag = 0) {
int nx = x + dx[i];
int ny = y + dy[i];
for(int j = 1; j<=K; j++) {
if((walls[j].X1==x&&walls[j].X2==nx&&walls[j].Y1==y&&walls[j].Y2==ny&&!enableKey[walls[j].G])
||
(walls[j].X1==nx&&walls[j].X2==x&&walls[j].Y1==ny&&walls[j].Y2==y&&!enableKey[walls[j].G]) ) {
flag = 1;
break;
}
}
if(flag) continue;
int tmp2;
point tmp;
tmp.X = nx;
tmp.Y = ny;
for(int i = 1; i<=mp[nx][ny][0]; i++) enableKey[mp[nx][ny][i]]++;
tmp2 = mp[nx][ny][0];
mp[nx][ny][0] = 0;
tmp.enableKey = enableKey;
if (nx <= N && nx > 0 && ny <= M && ny > 0 && vis[tmp] == 0) {
vis[tmp] = 1;
ret = min(ret,dfs(nx, ny, step+1));
}
mp[nx][ny][0] = tmp2;
for(int i = 1; i<=mp[nx][ny][0]; i++) enableKey[mp[nx][ny][i]]--;
}
// cout << ret << "=============== =========\n";
return ret;
}
int main() {
cin >> N >> M >> P;
cin >> K;
for(int i = 1; i<=K; i++) cin >> walls[i].X1 >> walls[i].Y1 >> walls[i].X2 >> walls[i].Y2 >> walls[i].G;
cin >> S;
for(int i = 1; i<=S; i++) {
cin >> keys[i].X1 >> keys[i].Y1 >> keys[i].Q;
mp[keys[i].X1][keys[i].Y1][++mp[keys[i].X1][keys[i].Y1][0]] = keys[i].Q;
}
sx = 1;
sy = 1;
tx = N;
ty = M;
int ret = dfs(sx,sy,0);
if(ret==2147483647) ret = -1;
cout << ret;
return 0;
}
搜到的路线是对的,但不是最短路径