其实这道题就是一道bfs变式(bfs + 几条捷径)
膜拜spfa的dalao
先把题目中一堆符号和字母表示为我们容易看的数字(当然也可以省去这一步)
接下来就是bfs模板 + 判断传送门
接下来的细节就见代码(良心提醒:有注释)
#include <bits/stdc++.h>
using namespace std;
const int maxn = 3e3 + 10;
int a[maxn][maxn], vis[maxn][maxn];
int n, m, edx, edy, stx, sty, ox, oy;
int dx[4] = {0, -1, 1, 0};
int dy[4] = {1, 0, 0, -1};
struct Node {
int x, y, val;
}now, node;
queue <Node> q;
inline void chuansongmen(int xx, int yy) {
int flag = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
if(!(xx == i && yy == j) && (a[i][j] == a[xx][yy])) {
flag = 1;
ox = i, oy = j;
}
}
}
if(flag == 0) {
ox = xx, oy = yy;
}
}
void bfs(int stx, int sty, int edx, int edy) {
vis[stx][sty] = 1;
node.x = stx, node.y = sty;
q.push(node);
while(q.empty() == false) {
now = q.front();
q.pop();
for(int i = 0; i < 4; i++) {
int xx = now.x + dx[i];
int yy = now.y + dy[i];
if((a[xx][yy] != -1) && (a[xx][yy] != 1) && a[xx][yy] != 0) {
chuansongmen(xx, yy);
xx = ox;
yy = oy;
}
if(xx < 1 || xx > n || yy < 1 || yy > m || a[xx][yy] == 1 || vis[xx][yy] == 1) continue;
else {
if(xx == edx && yy == edy) {
cout << now.val + 1;
return;
}
node.x = xx, node.y = yy, node.val = now.val + 1;
vis[xx][yy] = 1;
q.push(node);
}
}
}
}
int main() {
cin >> n >> m;
char s;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
cin >> s;
if(s == '#') a[i][j] = 1;
else if(s == '.') a[i][j] = 0;
else if(s == '=') {
edx = i, edy = j;
a[i][j] = -1;
}
else if(s == '@') {
stx = i, sty = j;
a[i][j] = -1;
}
else a[i][j] = s;
}
}
bfs(stx, sty, edx, edy);
return 0;
}
附上一组蛇皮数据
37 70
######################################################################
#....#TCP#...........................................................#
#....#####.....#......#..............................................#
#.............#.#....#.#.............................................#
#..............######W#..............................................#
#.............#........#..##############################.............#
#............#..V....V..#..#............................#..#...#.....#
#.............#........#....#............................#..#.#.#....#
#.............#..X##X..#..#...............W...............#..#...#...#
#............#...N##N...#..#.............................#...........#
#........MOO..#..@.....#....#.#.#.#...................#.#............#
#..............########.....#.#.#.##############.#.#..#.#............#
#...........................#.#.#.#.............#.#.#.#.#............#
#.......#########...........#.#.#.#.................#.#.#............#
#......#.........#..........#.#.#.#.................#.#.#............#
#..#.#.#G#R#A#S#S#.#.#......#.#.#.#.................#.#I#............#
#..###################......#T#C#P#.................#I#G#............#
#............................#.#.#...................#.#.............#
#....................................................................#
#....................................................................#
#......########........########.......#...........#...........#......#
#.....#...............#R......A#.......#.........#.#.........#.......#
#.....#...............#........#........#.......#...#.......#........#
#.....#...............#........#.........#.....#.....#.....#.........#
#.....#...............#........#..........#...#.......#...#..........#
#.....#...............#..M.....#...........#.#.........#.#...........#
#......########........########.............#...........#............#
#....................................................................#
#....................................................................#
#....................................................................#
####################################################################.#
#....................................................................#
##.###################################################################
#..#F#ZD#.#Y#.#JL#.#...#QJ#.#.#.#.#EK#....#.L#.............#BQ#......#
#.##Z####.#U#.####.#.#.####.#.#.#.####.#..####.............####.####.#
#....#DE#.###.#UH#...#.#HK#.#.#.#.#F...#........................#BY#.#
####################################################################=#
正确输出:232
完美谢幕,谢谢大家