【SSL 1823】消灭怪物(非传统BFS)

【SSL 1823】消灭怪物(非传统BFS)题目大意
小b现在玩一个极其无聊的游戏,它控制角色从基地出发,一路狂奔夺走了对方的水晶,可是正准备回城时,发现地图上已经生成了 n n n

题目大意

小B目前正在玩一个非常无聊的游戏,你从一个基地开始你的角色并试图偷走对手的水晶。然而,当他试图返回城市时,他意识到这个角色已经这么做了。生成在地图上。

n

n

怪物。

现在考虑地图是一个二维平面,所有怪物和角色都位于这个二维平面上的点。请帮小B算一算。从当前角色位置开始,你必须消灭至少一些怪物才能让他返回基地(坐标原点)。

注意:小b控制的角色只能向平行于坐标轴的方向(东、西、南、北)移动,并且每次必须移动整数距离。

数据范围

1

n

50000

1n50000

1n50000

1

X

,

y

1000

1x,y1000

1x,y1000

输入格式

第一行包含三个整数。

n

n

n 和字符的初始位置

X

,

y

(x,y)

(x,y)。

下一个

n

n

n行,每行包含奇怪的位置坐标

X

,

y

(x,y)

(x,y)。

输出格式

表示要消灭的怪物的最小数量的数字。

输入样本

7 6 3

6 2

5 2

4 3

21

7 3

5 4

6 4

输出样本

1

基本思路

了解你的起点和终点,并逐步扩展你的问题。

F

s

广度FS

BF的特点。

但很简单

F

s

广度FS

bfs只管理部分层数,但不管理通过的怪物数量。但问题是至少要经过怪物,所以绕道是非常有必要的,而且通常

F

s

广度FS

在bfs中,怪物点可能会先扩张,这就违反了这个原则。

所以我们引入了一些新东西:双端队列。

d

e

q

e

出库

德库。顾名思义,元素可以进入和离开团队的开头和结尾。因此,没有怪物的积分可以从队伍的开头进入,有怪物的积分可以从队伍的末尾进入,即使想要取积分也必须从队伍的开头取。这样可以让你在不消灭应该消灭的怪物的情况下,尽可能的避开怪物。

核心代码

#includebits/stdc++.h

使用命名空间标准。

typedef 无符号长长ull;

常量int N=1e3+10;

结构节点{

int x,y,cnt;

};

int n,sx,sy,w[4][2]={{0,1},{1,0},{0,-1},{-1,0}},ans=0x3f3f3f3f;

布尔v[N][N],a[N][N];

德克诺德库;

内联int bfs(){

q.push_back({sx,sy,0});

v[sx][sy]=真;

while(!q.empty()){

节点u=q.front();

q.pop_front();

if(u.x==0u.y==0)

return u.cnt;//到达终点

for(int i=0;i4;i++){

int xx=u.x+w[i][0],yy=u.y+w[i][1];

if(xx0||xx=N||yy0||yy=N) 继续;

if(v[xx][yy]==true) 继续;

if(a[xx][yy]==true)

q.push_back({xx,yy,u.cnt+1});

除此之外

q.push_front({xx,yy,u.cnt});

v[xx][yy]=真;

}

}

}

int main(){

ios:sync_with_stdio(假);

信都士;

for(int i=1,x,y;i=n;i++){

辛西;

a[x][y]=真;

}

coutbfs();

返回0。

}

以上#[SSL 1823]消灭怪物(非传统BFS)相关内容仅供大家参考。相关信息请参见官方公告。

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/93006.html

Like (0)
CSDN的头像CSDN
Previous 2024年7月4日
Next 2024年7月4日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注