这道题是不能用dfs吗?? 难道思路有问题吗?
// 思路:起点,移动,遇到传送装置就传送
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, m;
vector<vector<char>> mp(305, vector<char>(305));
vector<vector<int>> visited(305, vector<int>(305, INT_MAX)); // 用于记录到达每个点的 step
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
int ans = INT_MAX;
void dfs(int x, int y, int step) {
// 越界 || # || 当前路径非最优
if(x < 0 || y < 0 || x == n || y == m || mp[x][y] == '#' || step >= visited[x][y] || step >= ans) return;
if(mp[x][y] == '=') {
ans = min(ans, step);
return;
}
// 传送
if(mp[x][y] >= 'A' && mp[x][y] <= 'Z') {
int sign = false;
for(int i = 0; i < n; ++i) {
for(int j = 0; j < m; ++j) {
if(mp[i][j] == mp[x][y] && i != x && j != y) {
visited[x][y] = step;
dfs(i, j, step);
visited[x][y] = INT_MAX;
sign = true;
break;
}
}
if(sign) break;
}
}
// 向四个方向移动
for(int i = 0; i < 4; ++i) {
visited[x][y] = step;
dfs(x + dx[i], y + dy[i], step + 1);
visited[x][y] = INT_MAX;
}
}
void solve() {
cin >> n >> m;
int sx, sy;
for(int i = 0; i < n; ++i) {
for(int j = 0; j < m; ++j) {
cin >> mp[i][j];
if(mp[i][j] == '@') sx = i, sy = j;
}
}
dfs(sx, sy, 0);
cout << ans;
return;
}
int main() {
int t;
// cin >> t;
t = 1;
while(t--) {
solve();
}
return 0;
}