双向队列宽搜题目——回家之路

题目描述

小可家的位置比较偏僻,因此小可想修建一条回家之路。

回家的路为了方便必须接入到主要干道。为了方便起见,可以将所有地理坐标看作是一个平面直角坐标系,将主要干道的坐标设置为(0,0)点。为了修建这条道路,有些存在原有建筑的地方需要进行拆除。这条路小可想修的横平竖直,即不存在弯曲的地方或者斜着的地方。

现在请问最少拆除多少建筑可以将这条路修建起来。

输入描述

第一行包含三个整数N,x,y,表示建筑的数量和小可家的坐标。

然后输入N行,每行一个坐标,表示建筑所在位置的坐标。

输出描述

请你输出为了修建这条道路,最少需要拆除多少建筑?

输入样例

 
  1. 7 6 3
  2. 6 2
  3. 5 2
  4. 4 3
  5. 2 1
  6. 7 3
  7. 5 4
  8. 6 4

输出样例

 
  1. 1

数据范围

1≤N≤5∗10^​4​​,1≤x,y≤10^​3​​

解题思路

1.经典宽搜求最短路径

2.入队时需要拆除尾部入队,不需拆除头部优先入队

3.出队时头部出队

AC代码↓

#include<bitsdc++.h>
using namespace std;
int n,ex,ey,a[2005][2005],sdis[2005][2005],dis[2005][2005],vis[2005][2005],dx[]={1,0,-1,0},dy[]={0,1,0,-1},ans=0x3f3f3f3f;
deque<int>qx,qy;
int main(){
    cin>>n>>ex>>ey;
    int xxx,yyy;
    for(int i=1;i<=n;i++){
        scanf("%d%d",&xxx,&yyy);
        a[xxx][yyy]=1;
    }
    qx.push_front(0);
    qy.push_front(0);
    vis[0][0]=1;
    while(!qx.empty()){
        int x=qx.front();
        int y=qy.front();
        qx.pop_front();
        qy.pop_front();
        if(x==ex&&y==ey){
            ans=min(sdis[x][y],ans);
            /*for(int i=1;i<=10;i++){
				for(int j=1;i<=10;j++){
					cout<<sdis[i][j]<<' ';
				}
				cout<<endl;
			}*/
            //return 0;
        }
        for(int i=0;i<4;i++){
            int xx=x+dx[i];
            int yy=y+dy[i];
            if(xx>=0&&yy>=0&&xx<1015&&yy<1015&&vis[xx][yy]==0){
                vis[xx][yy]=1;
                if(a[xx][yy]==1){
                    qx.push_back(xx);
                    qy.push_back(yy);
                    dis[xx][yy]=dis[x][y];
                    sdis[xx][yy]=sdis[x][y]+1;
                }
                else{
                    qx.push_front(xx);
                    qy.push_front(yy);
                    dis[xx][yy]=dis[x][y]+1;
                    sdis[xx][yy]=sdis[x][y];
                }
            }
        }
    }
    cout<<ans;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值