36pts求助
查看原帖
36pts求助
548300
a1111111111111楼主2023/1/18 16:02

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;
}

搜到的路线是对的,但不是最短路径

2023/1/18 16:02
加载中...