首页 > 其他分享 >P5195 [USACO05DEC]Knights of Ni S

P5195 [USACO05DEC]Knights of Ni S

时间:2024-10-22 14:32:58浏览次数:1  
标签:Ni ch int LL 队列 && P5195 USACO05DEC 1002

为什么没有题解用优先队列,来个优先队列的。


先从起点 BFS 一遍,把到所有能到达灌木丛放入优先队列。

因为防止有些离终点近但不是最优的灌木丛更新答案。

再跑一遍优先队列 BFS 。

#include<bits/stdc++.h>
using namespace std;
#define LL long long

LL n, m, a[1002][1002], x1, y, sx, sy, f_x[4] = {1, -1, 0, 0}, f_y[4] = {0, 0, 1, -1}, t;
LL d[1000005][3],d1,d2,f1,f2;
bool b[1002][1002],u[1002][1002];
struct Node
{
    int x,y,z;
    Node(int x,int y,int z):x(x),y(y),z(z){}
    bool operator <(Node a) const  {  return z < a.z; }
    bool operator >(Node a) const  {  return z > a.z; }
};
    priority_queue<Node, vector<Node>, greater<Node> > f;  
    //stl大法好
inline LL read(){
    LL s=0,w=1;char ch;
    ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-'){w=-1;}ch=getchar();}
    while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+ch-'0';ch=getchar();}
    return s*w;
}

void print(LL x){
    char F[200];LL cnt=0;
    if(x<0) {x=-x;putchar('-');}
    if(x==0){putchar('0');putchar('\n');return ;}
    while(x){F[++cnt]=x%10;x/=10;}
    while(cnt){putchar(F[cnt--]+'0');}
    putchar('\n');
    return ;
}

int main(){
    /*freopen("2.in", "r", stdin);
    freopen("2.out", "w", stdout);*/
    m = read(), n = read();
    for (int i = 1; i <= n;i++){
        for (int j = 1; j <= m;j++){
            a[i][j] = read();
            if(a[i][j]==2)
                x1 = i, y = j;
        }
    }
    d[d1][0]=(x1);
    d[d1][1]=(y);
    d[d1][2]=(0);
    b[x1][y] = 1;
    while(d1<=d2){//裸的bfs
        x1 = d[d1][0];
        y = d[d1][1];
        t = d[d1][2];
        for (int i = 0; i < 4;i++){
            int xx = x1 + f_x[i], yy = y + f_y[i];
            if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&!b[xx][yy]&&a[xx][yy]!=3&&a[xx][yy]!=1){
                d[++d2][0]=(xx);
                d[d2][1]=(yy);
                d[d2][2]=(t+1);
                b[xx][yy] = 1;
                if(a[xx][yy]==4){
                //cout<<xx<<" "<<yy<<" "<<t+1<<endl;
                f.push(Node(xx, yy, t + 1));//放到优先队列里
                }
            }
        }
        d1++;
    }
    while(!f.empty()){//第二次优先队列bfs
        x1 = f.top().x;
        y = f.top().y;
        t = f.top().z;
        if(a[x1][y]==3){//终点第一次取出时就是最优答案
            print(t);
            return 0;
        }
        for (int i = 0; i < 4;i++){
            int xx = x1 + f_x[i], yy = y + f_y[i];
            if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&!u[xx][yy]&&a[xx][yy]!=1){
                f.push(Node(xx,yy,t+1));
                u[xx][yy] = 1;
            }
        }
        f.pop();
    }
    return 0;
}

成功跑到 \(85ms\)。

发布时间:2022-05-03 15:08

标签:Ni,ch,int,LL,队列,&&,P5195,USACO05DEC,1002
From: https://www.cnblogs.com/xingke233/p/18492666

相关文章

  • Unity 切换UI坐标和世界坐标
    usingUnityEngine;//这个脚本实现了,本脚本所在的游戏物体能够被拖拽publicclassDragObjectT:MonoBehaviour{privateVector3screenPoint;//存储物体在屏幕上的位置privateVector3offset;//存储鼠标点击位置与物体实际位置的偏移量privatebool......
  • 迁移学习与fine-tuning有什么区别
    迁移学习与fine-tuning的区别主要体现在:1.目标不同;2.训练策略不同;3.数据量要求不同;4.应用领域不同;5.模型性能的差异。总的来说,迁移学习是一种将在一个任务上学到的知识应用到另一个任务上的方法,而fine-tuning是迁移学习中的一种策略,通常用于调整预训练模型的参数以适应新的任务。......
  • Nuxt.js 应用中的 build:manifest 事件钩子详解
    title:Nuxt.js应用中的build:manifest事件钩子详解date:2024/10/22updated:2024/10/22author:cmdragonexcerpt:build:manifest是Nuxt.js中的一个生命周期钩子,它在Vite和Webpack构建清单期间被调用。利用这个钩子,开发者可以自定义Nitro渲染在最终HTM......
  • Nuxt.js 应用中的 build:manifest 事件钩子详解
    title:Nuxt.js应用中的build:manifest事件钩子详解date:2024/10/22updated:2024/10/22author:cmdragonexcerpt:build:manifest是Nuxt.js中的一个生命周期钩子,它在Vite和Webpack构建清单期间被调用。利用这个钩子,开发者可以自定义Nitro渲染在最终HTML中的......
  • 在Ubuntu小设备上使用VSCode+SSH开发部署nicegui的Web应用,并设置系统开机自动启动应用
    在一些小的设备上跑Ubuntu系统,需要快速的开发和调整项目的时候,往往使用SSH进行远程的开发测试,这样可以避免传统的打包更新处理,能够快速的在实际环境上测试具体的内容。另外由于系统设备往往需要重启后能够保留应用的工作,因此也需要在Ubuntu系统设置自动启动的服务处理。本篇随笔介......
  • Jenkins打包Unity游戏环境变量配置
    Jenkins打包Unity游戏失败,通过报错日志会查找到sdk环境有问题,解决sdk的环境问题后会出现ndk环境有问题,为了解决这两个问题导致的打包失败需要在Jenkins中配置环境变量打开Jenkins首页,选中ManagerJenkins,再点击System选项找到全局属性,勾选Environmentvariables选项点击......
  • 关于selenium 最近的更新记录
    1、导入元素操作方式有所变动,故导入的内容也要变更:fromselenium.webdriver.common.byimportBy2、获取元素的语句语句:driver.find_element(By.操作方式,"值")如获取ID:driver.find_element(By.ID,"值")获取类名:driver.find_element(By.CLASS_NAME,"值")获取CSS样式:driver......
  • Unity 切换鼠标光标图标
    在Unity中,可以通过检测鼠标左键的按下和弹起事件来切换鼠标光标。这可以通过在Update方法中检查Input.GetMouseButtonDown(0)和Input.GetMouseButtonUp(0)来实现。以下是一个示例代码,展示如何在左键按下时切换到一个自定义光标,在左键弹起时恢复到另一个光标或默认光标:示......
  • Unity Physics.Raycast发射一条射线并检测它与场景中物体的碰撞
    在Unity中,Physics.Raycast是一种非常常用的物理检测方法,用于发射一条射线并检测它与场景中物体的碰撞。这种方法在许多游戏场景中非常重要,例如用于射击、检测地面、触发事件等。1.基本概念射线(Ray):在三维空间中,射线是一个从某一点出发并沿着某个方向延伸的无穷长线。碰撞......
  • Unity 平滑移动
    Vector3.SmoothDamp是Unity中一个非常实用的方法,用于在平滑的方式下将一个向量(如位置)平滑地移动到另一个向量。这对于实现流畅的相机跟随、物体移动等效果非常有用。以下是对Vector3.SmoothDamp的详细讲解。方法签名csharpCopyCodepublicstaticVector3SmoothDamp(......