拖拉机


题目链接:https://www.acwing.com/problem/content/2021/

题解

将每个小方格看作一个点,从当前点到达相邻的方格时,若该方格有障碍物则看作边权为1,没有则看为0,该问题就可转换为从某个点到(0,0)点的最短路。

代码

#include 
#include 
#include 
#include 
#define x first
#define y second

using namespace std;

typedef pair PII;
const int N = 1010;
int n,sx,sy;
int a,b;
bool v[N][N],k[N][N];
int dist[N][N];

int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};

int bfs(int x,int y) {
    deque q;
    q.push_front({x,y});
    memset(dist,0x3f,sizeof dist);
    dist[x][y] = 0;
    
    while(q.size()) {
        auto t = q.front();
        q.pop_front();
        
        if(k[t.x][t.y]) continue;
        k[t.x][t.y] = 1;
        
        if(t.x == 0 && t.y == 0) break;
        
        for (int i = 0 ; i < 4 ; i ++ ) {
            int xx = t.x + dx[i] , yy = t.y + dy[i];
            if(xx >= 0 && xx < N && yy >= 0 && yy < N) {
                int u = v[xx][yy];
                if(dist[xx][yy] > dist[t.x][t.y] + u) {
                    dist[xx][yy] = dist[t.x][t.y] + u;
                    if(!u) q.push_front({xx,yy});
                    else q.push_back({xx,yy});
                }
            }
        }
    }
    return dist[0][0];
}

int main()
{
    cin >> n >> sx >> sy;
    for (int i = 0 ; i < n ; i ++ ) {
        cin >> a >> b;
        v[a][b] = 1;
    }
    
    int ans = bfs(sx,sy);
    
    cout << ans << endl;
    
    return 0;
}