dfs只能过两个点
查看原帖
dfs只能过两个点
957948
__dislike楼主2024/4/17 17:05

这道题是不能用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; 
}
2024/4/17 17:05
加载中...