当前位置: 代码迷 >> 综合 >> 2019. 拖拉机
  详细解决方案

2019. 拖拉机

热度:45   发布时间:2023-11-23 03:28:23.0

2019. 拖拉机

  •    题目
  •    提交记录
  •    讨论
  •    题解
  •    视频讲解

干了一整天的活,农夫约翰完全忘记了他把拖拉机落在田地中央了。

他的奶牛非常调皮,决定对约翰来场恶作剧。

她们在田地的不同地方放了 NN 捆干草,这样一来,约翰想要开走拖拉机就必须先移除一些干草捆。

拖拉机的位置以及 NN 捆干草的位置都是二维平面上的整数坐标点。

拖拉机的初始位置上没有干草捆。

当约翰驾驶拖拉机时,他只能沿平行于坐标轴的方向(北,南,东和西)移动拖拉机,并且拖拉机必须每次移动整数距离。

例如,驾驶拖拉机先向北移动 22 单位长度,然后向东移动 33 单位长度。

拖拉机无法移动到干草捆占据的位置。

请帮助约翰确定他需要移除的干草捆的最小数量,以便他能够将拖拉机开到二维平面的原点。

输入格式

第一行包含三个整数:NN 以及拖拉机的初始位置 (x,y)(x,y)。

接下来 NN 行,每行包含一个干草捆的位置坐标 (x,y)(x,y)。

输出格式

输出约翰需要移除的干草捆的最小数量。

数据范围

1≤N≤500001≤N≤50000,
1≤x,y≤10001≤x,y≤1000

输入样例:

7 6 3
6 2
5 2
4 3
2 1
7 3
5 4
6 4

输出样例:

1

范围应该是0-1001,使用广度优先进行图的搜索,因为有草堆和空地,使用双端队列,草地和空地都入队,但是优先选择空旷地,所以空地存储在front,草地在back

#include<iostream>
#include<algorithm>
#include<vector>
#include<deque>
#include<cstring>
using namespace std;
#define x first//pair成员定义
#define y second//pair成员定义

const int N=1010;
int g[N][N],cao[N][N];//g存储有不空地
typedef pair<int,int>pii;
deque<pii>d;
int sx,sy,n,x,y;
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
int bfs(int sx,int sy){
    memset(cao,0x3f,sizeof(cao));
    d.push_back({sx,sy});
    cao[sx][sy]=0;
    while(d.size()){
        pii p=d.front();
        d.pop_front();
        if(p.x==0&&p.y==0)return cao[0][0];
        for(int i=0;i<4;i++){
        int a=p.x+dx[i],b=p.y+dy[i];
        if(a<0||a>1001||b<0||b>1001)continue;//超限时
        if(cao[a][b]<=cao[p.x][p.y]+g[a][b])continue;//当前草堆数量小于时,不需要更新
        cao[a][b]=cao[p.x][p.y]+g[a][b];
        if(g[a][b])d.push_back({a,b});//有草堆
        else d.push_front({a,b});//无草堆
        }
    }
    return -1;
}
int main(){
    cin>>n>>sx>>sy;
    for(int i=1;i<=n;i++){
        cin>>x>>y;
        g[x][y]=1;
    }
    cout<<bfs(sx,sy);
    return 0;
}