展示一下我缝缝补补的艰难过程吧,刚开始没有考虑到一个点可以有多个传送门的情况,然后一直33.3%通过率,发现以后改成三维vector数组来存传送门的终点和起点。发现还是WA,网上查了优先队列的资料发现,他的排序方式和sort不一样,sort想要升序排列,需要step<a.step;,但是**优先队列要升序排需要step>a.step;**就这两个小细节WA了一个半小时几乎,还有就是读题的时候没读完,漏了下标从0开始 (@_@)
补充一点,无论是优先队列还是普通队列,先到达某一个点的路径一定是最短的,值得好好思考一下为什么优先队列的路径也是先到的是最短的,因为路径小的本来就排在队列前面。
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
int n, m, q;
const int M = 305;
char mp[M][M];
int sx, sy, tx, ty;
//struct node{
// int x1,x2,y1,y2;
//}a[1005];
int cnt = 0;
struct p {
int x, y, step;
p(int a, int b, int c) { x = a; y = b; step = c; }
p() {}
bool operator<(const p& a)const {
return step > a.step;
}
};
int vis[M][M];
//int pos[M][M];
priority_queue<p> s;
int mov[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
bool check(int x, int y) {
return x >= 0 && x < n && y >= 0 && y <m;
}
struct node {
int x, y;
node(int a, int b) {
x = a;
y = b;
}
node(){}
};
vector<node> ve[M][M];
void bfs() {
while (!s.empty()) {
p tmp = s.top();
s.pop();
// cout << tmp.x << " " << tmp.y << endl;
if (tmp.x == tx && tmp.y == ty) {
cout << tmp.step<<endl;
return;
}
for (int i = 0; i < ve[tmp.x][tmp.y].size(); i++) {
if (vis[ve[tmp.x][tmp.y][i].x][ve[tmp.x][tmp.y][i].y]) continue;
s.push(p(ve[tmp.x][tmp.y][i].x, ve[tmp.x][tmp.y][i].y, tmp.step + 3));
}
for (int i = 0; i < 4; i++) {
int xx = tmp.x + mov[i][0]; int yy = tmp.y + mov[i][1];
if (check(xx, yy) && !vis[xx][yy] && mp[xx][yy] != '#') {
vis[xx][yy] = 1;
//if (pos[xx][yy]) {
// int cx = cun[xx][yy].cx;
// int cy = cun[xx][yy].cy;
// if (!vis[cx][cy]) {
// //vis[cx][cy] = 1;
// s.push(p(cx, cy, tmp.step + 4));
// }
//}
s.push(p(xx, yy, tmp.step + 1));
}
}
}
cout << "-1" << endl;
return;
}
int main() {
while (cin >> n >> m >> q) {
memset(vis, 0, sizeof(vis));
// memset(pos, 0, sizeof(pos));
memset(mp, 0, sizeof(mp));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> mp[i][j];
if (mp[i][j] == 'S') {
sx = i; sy = j;
// cout << i << " " << j << endl;
}
if (mp[i][j] == 'T') {
tx = i; ty = j;
}
ve[i][j].clear();
}
}
for (int i = 1; i <= q; i++) {
int x1, x2, y1, y2;
cin >> x1 >> y1 >> x2 >> y2;
if (mp[x1][y1] == '#' ||mp[x2][y2]=='#') continue;
// a[++cnt].x1=x1; a[cnt].y1=y1; a[cnt].x2=x2; a[cnt].y2=y2;
//pos[x1][y1] = 1;
ve[x1][y1].push_back(node(x2,y2));
}
vis[sx][sy] = 1;
while (!s.empty()) { s.pop(); }
/*if (pos[sx][sy]) {
int xx = cun[sx][sy].cx;
int yy = cun[sx][sy].cy;
s.push(p(xx,yy,3));
s.push(p(sx, sy, 0));
}
else*/
s.push(p(sx, sy, 0));
bfs();
}
return 0;
}