题目描述
小可家的位置比较偏僻,因此小可想修建一条回家之路。
回家的路为了方便必须接入到主要干道。为了方便起见,可以将所有地理坐标看作是一个平面直角坐标系,将主要干道的坐标设置为(0,0)点。为了修建这条道路,有些存在原有建筑的地方需要进行拆除。这条路小可想修的横平竖直,即不存在弯曲的地方或者斜着的地方。
现在请问最少拆除多少建筑可以将这条路修建起来。
第一行包含三个整数N,x,y,表示建筑的数量和小可家的坐标。
然后输入N行,每行一个坐标,表示建筑所在位置的坐标。
请你输出为了修建这条道路,最少需要拆除多少建筑?
7 6 3
6 2
5 2
4 3
2 1
7 3
5 4
6 4
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;
}