您的位置:首页 > 博客中心 > 互联网 >

校内胡策 agar - BFS

时间:2022-05-05 01:29

problem 2 agar(agar.cpp)
题目描述
Skyfall 最近迷上了一个叫做 agar 的游戏。在这个游戏中,地图由 N*M 的点阵构成,每个 cell
占有一个点。体积大的 cell 可以吃掉体积小的 cell,吃掉之后,较大的 cell 的大小会增加被
吃掉的 cell 的大小。
比如:你的大小为 3,吃掉了一个大小为 2 的 cell 之后你的大小变为 5。
现在,地图上有 T 个细胞,第 i 个细胞的大小为 Qi,位置为 Xi,Yi 。( 保 证 这 T 个 cell 坐标互不
相同且 Qi>0)
这些 cell 被 dc 的魔法定住了(也就是说这些 cell 不可以主动移动) skyfall 的大
小为 Q0,skyfall 的出生位置为(X0,Y0),skyfall 可以向上向下向左向右运动
Skyfall 当然不想自己被吃掉,同时他也想知道自己最多吃掉多少个 cell
1:可能存在 skyfall 一个 cell 都吃不到的情况
2:若 skyfall 主动跟一个等大的 cell 在一个坐标,那么 skyfall 与他共存且不可移动
输入描述
第一行 N M T 表示地图的大小与细胞的个数接下来 T 行 每行三
个整数 Qi Xi Yi 表示第 i 个 cell 的大小位置
最后一行为 Q0 X0 Y0 表示 skyfall 的初始大小与位置
输出描述
两个整数:第一个整数表示 skyfall 最多吃掉多少细胞,第二个整数 skyfall 吃掉这些细胞后的最
终大小
如果 skyfall 被吃了,输出”233”(不带引号)
样例输入
3 3 4
10 1 1
4 1 2
10 2 1
2 3 3
5 2 2
样例输出
4 31
数据范围及提示
对于 50%的数据,N<=10,M<=10,所有细胞的大小均在 100 以内随机得到。
对于 100%的数据,N,M <= 1000;T<=50000,所有数据的大小均在 long long 范围内(意思就是
你不需要打高精),每个细胞的坐标均满足:1<=x<=N,1<=y<=M。

 

AC Code:

#include
#include
#include
#include
using namespace std;
typedef long long ll;
int dx[]={0,0,-1,1},dy[]={1,-1,0,0};
ll map[1100][1100];
bool vis[1100][1100];
ll n,m,t,Q;
ll read()
{
    char ch=‘ ‘;int w=1;ll a=0;
    while(ch<‘0‘||ch>‘9‘) 
    {
        if(ch==‘-‘) w=-1;
        ch=getchar();
    }
    while(ch>=‘0‘&&ch<=‘9‘) a=a*10+ch-‘0‘,ch=getchar();
    return w*a;
}
struct node{
    int x,y;
};
queueq;
priority_queue,greater >h;
ll ansc=0,ansz=0;
void bfs()
{
    while(q.size())
    {
        node a=q.front();q.pop();
        int x=a.x,y=a.y;
        for(int i=0;i<4;i++)
        {
            int xx=x+dx[i],yy=y+dy[i];
            if(xx>0&&xx<=n&&yy>0&&yy<=m&&!vis[xx][yy])
            {
                vis[xx][yy]=1;
                if(map[xx][yy]>=ansz)
                //!!若存在现在吃不了的细胞 可先将其加入一个小根堆 等到再遇到可以吃的细胞时再判断能否被吃掉 就不用再回去吃了 
                {
                    h.push((ll){map[xx][yy]});
                }
                else
                {
                    if(map[xx][yy])
                    {
                        ansc++,ansz+=map[xx][yy];
                        //!! 当时吃不了的细胞 现在可能会被吃掉 
                        while(h.size()&&h.top()Q)
    //如果正好出生在比它大的细胞上 就会直接被吃掉 
    {
        printf("233");return 0;
    }
    else 
    {
        ansz+=Q;
        //!!! 先加上自身的大小 因为会存在”出生在和它等大的细胞上“的情况 
        if(map[x][y]&&map[x][y]

 

热门排行

今日推荐

热门手游