2019. 拖拉机
双端队列的题。
需要再好好整理。
不太会。
地图需要到1001,因为可以绕出到地图去。
如果干草堆将起点或者终点包围,最后的结果就肯定不是0。
优质题解
#include<iostream>
#include<algorithm>
#include<cstring>
#include<deque>
#define x first
#define y second
using namespace std;
const int N = 1010;
typedef pair<int,int>PII;
int x0,y0,xe=0,ye=0;
int a[1010][1010];
int st[1010][1010];
int dis[1010][1010];
int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1};
deque<PII> q;
int BFS(int x0,int y0)
{
q.push_front({x0,y0});
memset(dis,0x3f,sizeof(dis));
dis[x0][y0] = 0;
while(!q.empty())
{
PII top = q.front();
q.pop_front();
if(top.x==0&&top.y==0) break; //判断是否到达终点
if(st[top.x][top.y]) continue; //出队时判重
st[top.x][top.y] = 1;
for(int i=0;i<4;i++)
{
int x=top.x+dx[i];
int y=top.y+dy[i];
if(x>=0&&x<=1001&&y>=0&&y<=1001)
{
int w = 0;
if(a[x][y]) w = 1;
if(dis[x][y] > dis[top.x][top.y] + w) //dijkstra算法思想
{
dis[x][y] = dis[top.x][top.y] + w;
if(!w) q.push_front({x,y}); //如果边权是0 放队头
else q.push_back({x,y}); //如果边权是1 放队尾
}
}
}
}
return dis[0][0];
}
int main()
{
int n;
cin>>n>>x0>>y0;
for(int i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
a[x][y] = 1;
}
cout<<BFS(x0,y0);
}