题目描述:
主要思路:
本题是一个点权的问题,可以抽象为边权值为0,1的最短路问题。
可以利用dijkstra做,也可用双端队列替换dijkstra里边的堆
#include<iostream>
#include<algorithm>
#include<cstring>
#include<deque>
using namespace std;
const int N=1010;
typedef pair<int,int> pa;
int dis[N][N];
bool book[N][N];
bool cao[N][N];
int go[][2]={1,0,-1,0,0,1,0,-1};
int bfs(int bx,int by)
{
deque<pa> q;
memset(dis,0x3f,sizeof(dis));
dis[bx][by]=0;
q.push_back({bx,by});
while(q.size())
{
pa now=q.front();
q.pop_front();
if(book[now.first][now.second]) continue;
book[now.first][now.second]=1;
for(int i=0;i<4;i++)
{
int x=now.first+go[i][0],y=now.second+go[i][1];
if(x>=0&&y>=0&&x<=1001&&y<=1001)
{
int diss=(cao[x][y]?1:0);
if(dis[x][y]>dis[now.first][now.second]+diss)
{
dis[x][y]=dis[now.first][now.second]+diss;
if(diss) q.push_back({x,y});
else q.push_front({x,y});
}
}
}
}
return dis[0][0];
}
int main()
{
int n,bx,by;
cin>>n>>bx>>by;
while(n--)
{
int x,y;
cin>>x>>y;
cao[x][y]=true;
}
cout<<bfs(bx,by)<<endl;
return 0;
}