acwing提高--多源BFS+最小步数模型+双端队列广搜

news2024/12/22 22:12:05

多源BFS 

1.矩阵距离

题目https://www.acwing.com/problem/content/description/175/

#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;
const int N=1010;
char g[N][N];
int dist[N][N];
PII q[N*N];
int n,m;
int dx[]={-1,0,1,0},dy[]={0,-1,0,1};
void bfs()
{
    memset(dist,-1,sizeof dist);
    int hh=0,tt=-1;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            if(g[i][j]=='1')
            {
                dist[i][j]=0;
                q[++tt]={i,j};
            }
    while(hh<=tt)
    {
        auto t=q[hh++];
        for(int i=0;i<4;i++)
        {
            int xx=t.x+dx[i],yy=t.y+dy[i];
            if(xx<0||xx>=n||yy<0||yy>=m)continue;
            if(dist[xx][yy]!=-1)continue;
            dist[xx][yy]=dist[t.x][t.y]+1;
            q[++tt]={xx,yy};
        }
    }
}
int main()
{
    cin>>n>>m;
    for(int i=0;i<n;i++)scanf("%s",g[i]);
    bfs();
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
            cout<<dist[i][j]<<" ";
        cout<<endl;
    }
}

最小步数模型 

魔板

题目https://www.acwing.com/problem/content/description/1109/

#include<bits/stdc++.h>
using namespace std;
char g[2][8];
unordered_map<string,int> dist;
unordered_map<string,pair<char,string>> pre;
queue<string> q;
void Set(string str)
{
    for(int i=0;i<4;i++)g[0][i]=str[i];
    for(int i=3,j=4;i>=0;i--,j++)g[1][i]=str[j];
}
string get()
{
    string res;
    for(int i=0;i<4;i++)res+=g[0][i];
    for(int i=3;i>=0;i--)res+=g[1][i];
    return res;
}
string move0(string state)
{
    Set(state);
    for(int i=0;i<4;i++)
    swap(g[0][i],g[1][i]);
    return get();
}
string move1(string state)
{
    Set(state);
    char v0=g[0][3],v1=g[1][3];
    for(int i=3;i>0;i--)
    for(int j=0;j<2;j++)
    g[j][i]=g[j][i-1];
    g[0][0]=v0,g[1][0]=v1;
    return get();
}
string move2(string state)
{
    Set(state);
    char v=g[0][1];
    g[0][1]=g[1][1];
    g[1][1]=g[1][2];
    g[1][2]=g[0][2];
    g[0][2]=v;
    return get();
}
void bfs(string start,string end)
{
    if(start==end)return;
    q.push(start);
    dist[start]=0;
    while(q.size())
    {
        auto t=q.front();
        q.pop();
        
        string m[3];
        m[0]=move0(t);
        m[1]=move1(t);
        m[2]=move2(t);
        
        for(int i=0;i<3;i++)
        {
            string str=m[i];
            if(dist.count(str)==0)
            {
                dist[str]=dist[t]+1;
                pre[str]={char(i+'A'),t};
                if(str==end)break;
                q.push(str);
            }
        }
    }
}
int main()
{
    string start,end;
    for(int i=0;i<8;i++)
    {
        int x;
        cin>>x;
        end+=char(x+'0');
    }
    for(int i=0;i<8;i++)start+=char(i+'1');
    
    bfs(start,end);
    
    cout<<dist[end]<<endl;
    
    string res;
    while(end!=start)
    {
        res+=pre[end].first;
        end=pre[end].second;
    }
    reverse(res.begin(),res.end());
    if(res.size())
    cout<<res;
}



双端队列广搜(权值只有0和1的时候)

电路维修

题目icon-default.png?t=N4HBhttps://www.acwing.com/problem/content/description/177/

题解 icon-default.png?t=N4HBhttps://www.acwing.com/solution/content/21775/

 

 

 

 

 

#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef pair<int,int> PII;
const int N=550;

char g[N][N];
int dist[N][N];
bool st[N][N];

int n,m;
char cs[5]="\\/\\/";//四个标准方向\/\/,用来比较地图上的方向是否一致
int dx[]={-1,-1,1,1},dy[]={-1,1,1,-1};//转换的方向,\/\/
int ix[]={-1,-1,0,0},iy[]={-1,0,0,-1};//对应地图的坐标的\/\/


int bfs()
{
    deque<PII> q;//双端队列
    memset(st,0,sizeof st);//清空状态
    memset(dist,0x3f,sizeof dist);//清空距离
    
    q.push_back({0,0});
    dist[0][0]=0;
    
    while(q.size())
    {
        auto t=q.front();
        q.pop_front();
        
        int x=t.x,y=t.y;
        if(x==n&&y==m)return dist[x][y];//假如已经搜到n,m了,直接返回
        
        if(st[x][y])continue;
        st[x][y]=true;
        
        for(int i=0;i<4;i++)
        {
            int a = x + dx[i],b = y + dy[i];
            if(a<0||a>n||b<0||b>m)continue;
            int ga=x+ix[i],gb=y+iy[i];
            int w=(g[ga][gb]!=cs[i]);//看原图是否跟我转移的方向一致,是则为0,反正为1
            int d=dist[x][y]+w;
            if(d<dist[a][b])//假如距离小于到我的距离
            {
                dist[a][b]=d;//则更新最小距离
                if(!w)q.push_front({a,b});//假如为0,则放队头
                else q.push_back({a,b});//假如为1,则放队尾
            }
        }
    }
    return -1;//一定不会被执行到
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        
        for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        cin>>g[i][j];
        
        if( n+m & 1) cout<<"NO SOLUTION"<<endl;//分析可得,假如和在奇数点是无法到达的
        else  cout<<bfs()<<endl;
    }
    
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/550256.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【轻量化网络系列(2)】MobileNetV2论文超详细解读(翻译 +学习笔记+代码实现)

前言 上一篇我们介绍了MobileNetV1&#xff0c;主要是将普通Conv转换为dw和pw&#xff0c;但是在dw中训练出来可能会很多0&#xff0c;也就是depthwise部分得到卷积核会废掉&#xff0c;即卷积核参数大部分为0&#xff0c;因为权重数量可能过少&#xff0c;再加上Relu激活函数…

稳定币是个好生意

* * * 原创&#xff1a;刘教链 * * * 本月早些时候&#xff0c;市值第一的稳定币发行商Tether公布了其一季度的储备和盈利数据[1]。不能说是亮眼&#xff0c;只能说是非常亮眼。就看几个亮点吧&#xff1a; 1. 一季度净利润14.8亿美元&#xff0c;是2022年四季度的两倍多&…

关于Java中的抽象类注意事项

文章目录 &#x1f3c6;文章导读&#x1f342;抽象类的定义&#x1f342;抽象类的特性&#x1f342;总结&#xff1a;面试题普通类和抽象类有哪些区别&#xff1f;抽象类能使用final继承吗&#xff1f; &#x1f3c6;文章导读 在本篇文章中&#xff0c;对抽象类进行了一个详细的…

c++学习——c与c++const修饰的变量的区别

c语言下const修饰的变量 1、c语言下const修饰的变量都有空间 2. c语言的const修饰的全局变量具有外部链接属性 07 const修饰的变量.c #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> #include <stdlib.h>const int a 10;//常…

1. Linux环境搭建及问题解决方案

本文介绍了Linux环境搭建的过程以及遇到的问题和解决方案&#xff0c;并且介绍了常用的Linux命令. 一、Linux环境搭建 整体所需的环节 安装VMware安装Linux &#xff08;这边我选的是Server版本&#xff09;安装配置Samba&#xff08;Samba是一种Linux和Windows之间进行文件共…

二层环路详解:交换机环路产生的过程和原因

前言&#xff1a; 在了解环路之前得先了解交换机的工作原理&#xff0c;当然交换机的基本工作原理其实非常简单&#xff0c;只有“单播转发与泛洪转发”、“交换机MAC地址表”这两个&#xff01;其他的如vlan&#xff0c;生成树等也是在此基础上增加的&#xff0c;弥补交换机基…

初始Linux的基本操作

上篇博客中&#xff0c;我介绍了关于Linux的相关概念&#xff0c;让我们初步的了解到Linux的重要性&#xff0c;在这篇博客中我会再讲一些Linux操作系统的理解。 一.操作系统 我们知道Linux是一个操作系统&#xff0c;而操作系统操作系统(英语&#xff1a;Operating System&…

[深度好文]10张图带你轻松理解关系型数据库系统的工作原理

[深度好文]10张图带你轻松理解关系型数据库系统的工作原理 原文(欢迎关注)&#xff1a;https://mp.weixin.qq.com/s/CNCfWRpv8QlICGvZkLG4Jw 尽管数据库在我们应用程序中扮演着储存几乎所有状态的关键角色&#xff0c;但人们对其运行原理的了解通常仅停留在较为浅显的层面&…

跟我一起使用 compose 做一个跨平台的黑白棋游戏(4)移植到compose-jb实现跨平台

前言 在上一篇文章中&#xff0c;我们已经实现了游戏的所有界面和逻辑代码&#xff0c;并且在 Android 上已经可以正常运行。 这篇文章我们将讲解如何将其从使用 jetpack compose 修改为使用 compose-jb 从而实现跨平台。 老规矩&#xff0c;先看效果图&#xff1a; 可以看到…

063:cesium设置带边界线材质(material-7)

第063个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置带边界折线材质,请参考源代码,了解PolylineOutlineMaterialProperty的应用。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共89行)相关API参考…

Python-matplotlib中的pie(饼)图

Python-matplotlib中的pie&#xff08;饼&#xff09;图 %matplotlib inline import matplotlib.pyplot as pltm 51212 f 40742 m_perc m/(mf) f_perc f/(mf)colors [navy,lightcoral] labels ["Male","Female"]plt.figure(figsize(8,8)) paches,te…

为什么不胜任的人,反而获得晋升?

作者| Mr.K 编辑| Emma 来源| 技术领导力(ID&#xff1a;jishulingdaoli) 也许你有过这样的经历&#xff0c;自己勤勤恳恳地干活&#xff0c;每个月却只拿着微薄的薪水&#xff0c;有些人明明无法胜任工作&#xff0c;却像坐了火箭一样飞速晋升。这种现象在现实生活中无处不在…

3699元还配同价位最好屏幕!Redmi Book 14评测:几乎完美的“水桶”轻薄本

一、前言&#xff1a;4K价位最好屏幕 不久前&#xff0c;有网友让我推荐一台4000元价位的轻薄本&#xff0c;笔者直接选了一台搭载i5-13500H处理器且价格仅售4299元的某一线品牌产品。 但是&#xff0c;事后才发现不对&#xff0c;因为这款极具性价比的笔记本竟然用了45%NTSC色…

MIT6.824 lecture5上课笔记(涉及到Lab2A)- Go threads and raft

总结&#xff1a;本节课讲解了一些会在lab2中使用到的go的多线程技巧&#xff0c;会给一些简单的demo&#xff0c;lab2中可能会借鉴这些demo。 详细的Lab2 raft算法实现源码&#xff0c;请参考我的个人仓库&#xff08;记得点颗星星&#xff09;, 配合readme食用更佳。 MIT6.…

ChatGPT 使用 拓展资料:如何善用大语言模型的推理能力?

ChatGPT 使用 拓展资料:如何善用大语言模型的推理能力?

ChatGPT Plus 会员续费扣款失败如何处理

扣款失败 笔者由于开通 ChatGPT Plus 会员比较早&#xff0c;3月26日一个月就到期了&#xff0c;但是最近几天注意到&#xff0c;虚拟卡上也没有提醒我扣费&#xff0c;还是能继续使用 GPT-4.0&#xff0c;就很奇怪&#xff0c;于是就研究了一番。 PS: 如果有小伙伴还不会开通 …

python 文件操作 , 异常处理 , 模块和包

文件操作 1.写数据 # open(name, mode) # name&#xff1a;是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。 # mode&#xff1a;设置打开文件的模式(访问模式)&#xff1a;只读、写入、追加等。 #1.打开文件---通道建立--申请资源 # w 模式会清空之前的内…

【三维激光扫描】实验04:SiScan基于点云的量测功能

SiScan软件提供的基于点云的量测功能有:两点距离量测、多点距离量测、点到面距离量测、高度量测、坡度量测、角度量测、投影面积量测等等。 文章目录 一、两点距离量测二、多点距离量测三、点到面距离量测四、高度量测五、坡度量测六、角度量测七、投影面积量测一、两点距离量…

分布式与并行计算—并向算法实现

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 原始串行快速排序算法中有“分而治之”的递归调用部分&#xff0c;在每次选择pivoit并把序列按照小于pivoIt和大于pivoit分成两类后&#xff0c;左右两部分的递归排序可以并发执行。 运行时间 为了减小偶然性因素造成的时间差…