BFS 1块、算多少次

目录

1.矩阵内部的1块

2.从1开始,+1或乘2,计算要多少次达到n

3.迷宫路径


1.矩阵内部的1块

#include <iostream>
#include <vector>
#include <cmath>
#include <string>
#include <cstring>
#include <queue>
using namespace std;
const int N=130,maxn=101;
int n=2,m=2,k;
int wi[N]={1,2},C[maxn][maxn]={0},inq[maxn][maxn]={0},W[maxn][maxn];
int r[]={0,0,1,-1};
int c[]={1,-1,0,0};
int step=0;int ans=-1;int w0;
struct node
{int x,y;
}Node; // node是结构体类别名,Node是结构体的个体的名字 
bool can(int x,int y)
{if(x>n || y>m ||x<0 ||y<0) {//printf("1");return false;}if(inq[x][y] || !W[x][y]) {//printf("2");printf("#%d%d#$%d%d$",x,y,inq[x][y] , !W[x][y]);return false;	}return true;
}void bfs(int x,int y)
{queue<node> q;Node.x=x;Node.y=y;q.push(Node);inq[x][y]=1;while(!q.empty()){node Node2=q.front();q.pop();int X=Node2.x;int Y=Node2.y;
for(int j=0;j<4;j++){int nx=X+r[j];int ny=Y+c[j];//printf(">");if(can(nx,ny)) {Node.x=nx;Node.y=ny;q.push(Node);inq[nx][ny]=1;//printf("Test%d%dtesT",nx,ny);}}}
}int main()
{//D[0][0]=1;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{scanf("%d",&W[i][j]);}
int ans=0;
for(int i=0;i<n;i++)
{for(int j=0;j<m;j++)
{if(can(i,j)){//printf("^");bfs(i,j);ans++;//printf("\n-%d%d-\n",i,j);}
}}
printf("%d",ans);
}

2.从1开始,+1或乘2,计算要多少次达到n

如何记录次数?我选择再开一个queue,

demo, 这个代码超时了

#include <iostream>
#include <vector>
#include <cmath>
#include <string>
#include <cstring>
#include <queue>
using namespace std;
const int N=13,maxn=10;
int n=2,m=2,k;
int wi[N]={1,2},C[maxn][maxn]={0},inq[maxn][maxn]={0},W[maxn][maxn];int bfs(int n)
{int ans=0;
queue<int> q,q2;
q.push(1);q2.push(ans);while(q.front()!=n){int a=q.front();int a2=q2.front();//printf(" %d ",a);q.pop();a2++;q2.pop();q.push(a+1);q2.push(a2);q.push(a*2);q2.push(a2);}return q2.front();
}int main()
{//D[0][0]=1;
scanf("%d",&n);
//for(int i=0;i<n;i++)
//for(int j=0;j<m;j++)
//{scanf("%d",&W[i][j]);}
//int ans=0;
//for(int i=0;i<n;i++)
//{for(int j=0;j<m;j++)
//{
//	if(can(i,j))
//	{//printf("^");
//	bfs(i,j);ans++;//printf("\n-%d%d-\n",i,j);
//	}
//}
printf("%d",bfs(n));
}

改进:1.没有用一个列表记录不让他重复入队的问题 。

2.如何知道BFS深度?

我用了两个队列,或许这是超时的主要原因),答案是每次记录队列长度,遍历一个队列(同一层·时,在同一个循环里头),循环完了step++

3.        //###这一步很重要 ,我之前写的是for(int i=0;i<q.size();i++),最后算出来结果不对,原因是q.size随着循环在变化,应当在循环结束时更新,而不是一边循环一边更新 

#include <iostream>
#include <vector>
#include <cmath>
#include <string>
#include <cstring>
#include <queue>
using namespace std;
const int N=200000,maxn=10;
int n=2,m=2,k;
//int wi[N]={1,2},C[maxn][maxn]={0},inq[maxn][maxn]={0},W[maxn][maxn];
int hs[N]={0};int bfs(int n)
{int ans=0;
queue<int> q;//,q2;
q.push(1);//q2.push(ans);
hs[1]=1;while(1){int cnt=q.size();//###这一步很重要 ,我之前写的是for(int i=0;i<q.size();i++),最后算出来结果不对,原因是q.size随着循环在变化,应当在循环结束时更新,而不是一边循环一边更新 for(int i=0;i<cnt;i++){//printf("%d ",q.front());int a=q.front();//int a2=q2.front();printf(" %d ",a);q.pop();//a2++;q2.pop();//if(a==n) return ans;if(a+1==n || a*2==n) return ans+1;//q.push(a+1);q2.push(a2);q.push(a*2);q2.push(a2);if(!hs[a+1] && a+1<=n){q.push(a+1);hs[a+1]=1;}//&&前后最好掉一下位置,否则数组要开大一点,不然数组会越界,血与泪的教训。if(!hs[a*2] && a*2<=n){q.push(a*2);hs[a*2]=1;}}ans++;}//return q2.front();
}int main()
{//D[0][0]=1;
scanf("%d",&n);
//for(int i=0;i<n;i++)
//for(int j=0;j<m;j++)
//{scanf("%d",&W[i][j]);}
//int ans=0;
//for(int i=0;i<n;i++)
//{for(int j=0;j<m;j++)
//{
//	if(can(i,j))
//	{//printf("^");
//	bfs(i,j);ans++;//printf("\n-%d%d-\n",i,j);
//	}
//}
printf("%d",bfs(n));
}

思考:如何记录最佳算法?

类似于这种pre数组,用了运筹学动态规划的思想,全局最优的话,一定局部最优,

比如 如果你是从7到的14,那么,7之前一定是按照“如何到7”的最优方法走的,最后pre数组相当于打表,记录了每一个数字前一个必经之数。

 

具体懒得写了,将在下一个 迷宫路径 中进行具体实现。 

3.迷宫路径

见下一篇

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

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

相关文章

警惕!新增4本SCI/SSCI被剔除!6月WOS更新(附下载)

本周投稿推荐 SSCI • 中科院2区&#xff0c;6.0-7.0&#xff08;录用友好&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; CNKI • 7天录用-检索&#xff08;急录友好&#xff09; SCI&EI • 4区生物医学类&#xff0c;0.5-1.0&#xff08;录用…

入侵检测系统(IDS)

入侵检测 入侵检测&#xff08;Intrusion Detection&#xff09;是指发现或确定入侵行为存在或出现的动作&#xff0c;也就是发现、跟踪并记录计算机系统或计算机网络中的非授权行为&#xff0c;或发现并调查系统中可能为视图入侵或病毒感染所带来的异常活动。 入侵检测系统 …

neo4j 3.5.5版本创建新的数据库

neo4j 3.5.5版本创建新的数据库 1.找到neo4j的conf文件 点进去 2.点击neo4j.conf 选择记事本打开 3.把graph.db换成自己想要创建的数据库名称 4.打开neo4j服务 出现新的数据库

System.Data.OracleClient.OracleException:“ORA-12571: TNS: 包写入程序失败

System.Data.OracleClient.OracleException:“ORA-12571: TNS: 包写入程序失败 解决方法&#xff1a; 首先%oracle_home%/network/admin下的sqlnet.ora文件&#xff0c;把SQLNET.AUTHENTICATION_SERVICES (NTS)加个 # 注释掉就好了

Android 一个改善的okHttp封装库

Android Studio 使用前&#xff0c;对于Android Studio的用户&#xff0c;可以选择添加: compile project(‘:okhttputils’) 或者 compile ‘com.zhy:okhttputils:2.0.0’ Eclipse 自行copy源码。 二、基本用法 目前基本的用法格式为&#xff1a; OkHttpUtils .get()…

不收费的视频转文字软件有那些?4款视频转文字工具让你效率翻倍!

​视频转文字&#xff0c;也称为视频字幕生成或视频语音识别&#xff0c;是一种将视频中的语音内容转换成文字的技术。视频转文字真的不同的人群所用的工具有所差异&#xff01; 以下是三款免费的在线视频转文字工具推荐&#xff1a; 1&#xff1a;剪映 主要针对人视频制作人…

深入理解Java集合框架:全面介绍与简单使用

Java集合框架&#xff08;Java Collections Framework, JCF&#xff09;是Java编程语言中一个强大而灵活的工具&#xff0c;用于存储和操作一组数据。本文将详细介绍Java集合框架的基本组成部分&#xff0c;通过类图展示各类之间的关系&#xff0c;并提供常用集合框架的使用案例…

移植案例与原理 - XTS子系统之应用兼容性测试套件(1)

本文主要通过实例分析下ACTS应用兼容性测试套件移植案例&#xff0c;以及移植过程中特定的操作的原理。主要讲述的是轻量系统兼容性测试。轻量系统因系统能力限制&#xff0c;兼容性测试在系统初始化阶段进行&#xff1b;并且各设备烧录工具存在差异&#xff0c;导致自动化工具…

第二证券股市资讯:昨夜!全球新“股王”诞生

昨晚&#xff0c;英伟达成全球市值榜首公司。 当地时间6月18日&#xff0c;美股三大指数小幅收高&#xff0c;标普500指数与纳指再创前史新高。标普500指数涨0.25%&#xff0c;道指涨0.15%&#xff0c;纳指涨0.03%。 AI热潮推动英伟达大涨&#xff0c;市值逾越微软、苹果&…

【实战】Spring Cloud Stream 3.1+整合Kafka

文章目录 前言新版版本优势实战演示增加maven依赖增加applicaiton.yaml配置新增Kafka通道消费者新增发送消息的接口 实战测试postman发送一个正常的消息postman发送异常消息 前言 之前我们已经整合过Spring Cloud Stream 3.0版本与Kafka、RabbitMQ中间件&#xff0c;简直不要太…

华为鸿蒙 使用router跳转页面 和 router.getParams接收参数并使用参数 [最简单 最直接 的详细教程 ]

1, 准备两个页面 1. pages/DetailPage.ets 2. pages/Index.ets 2, 代码直接 cv 页面 // pages/Index.ets import router from ohos.router// 参数类型 class User {name: stringage: number }Entry Component struct Index {// 要传的参数Stateuser: User {name: John,…

避免指针成员重复释放

类中有指针成员时&#xff0c;如何避免重复释放 在下面的代码中&#xff0c;类A保存有1个指针&#xff0c;并且理所当然的在构造函数中分配内存&#xff0c;析构中释放内存&#xff0c;但会发生重复释放的问题。 原因&#xff1a;编译器自动生成如下的拷贝构造(析构函数不影响拷…

学习分享-Tomcat 的线程池在工作方式上与普通的 Java 线程池的区别

前言 最近在学习过程中遇到在某个场景下&#xff1a;修改某条数据时&#xff0c;给该线程上分布式写锁&#xff0c;然后引入延迟队列处理其他请求&#xff1b;这个方案有一定的缺点&#xff0c;因为在用到消息队列时&#xff0c;不存在占用过多线程从而导致OOM的问题&#xff…

【解决方案】Java 互联网项目中消息通知系统的设计与实现

前言 消息通知系统&#xff08;notification-system&#xff09;作为一个独立的微服务&#xff0c;完整地负责了 App 端内所有消息通知相关的后端功能实现。该系统既需要与文章系统、订单系统、会员系统等相关联&#xff0c;也需要和其它业务系统相关联&#xff0c;是一个偏底层…

docker-compose设置永久启动、自动重启

步骤一 找到 docker-compose.yml 文件 步骤二 vim 打开文件 找到 image: PS&#xff1a;就是为了对齐格式 步骤三 在其下方添加&#xff1a; restart: always而后保存即可

注意力机制简介

为了减少计算复杂度&#xff0c;通过借鉴生物神经网络的一些机制&#xff0c;我们引入了局部连接、权重共享以及汇聚操作来简化神经网络结构。神经网络中可以存储的信息量称为网络容量。一般来讲&#xff0c;利用一组神经元来存储信息的容量和神经元的数量以及网络的复杂度成正…

js算数数据失真

起因 数字的运算失真问题在每个语言中都有体现&#xff0c;在java中使用BigDecimal就可以很好的避免这种情况。前端中没有这样一种类型来处理这种情况 引入别人写好的包 一开始准备自己写&#xff0c;但是觉得太麻烦可以使用 BigNumber.js 这样的库来执行精确的除法运算&#x…

表面声波滤波器——工艺 (5)

制作工艺流程 声表面波器件制作采用半导体集成电路的平面工艺,首先在压电衬底上通过光刻、镀膜、剥离或刻蚀等工艺制备出叉指换能器&#xff0c;然后经过划片、粘片、压丝、封焊等后续封装工艺得到最后的器件。 整个工艺过程中需要操作使用各种机台 清洗机光刻机涂胶显影台全…

京东商品详情API:解锁电商数据的金钥匙

引言 京东开放平台为开发者提供了丰富的API资源&#xff0c;其中商品详情API尤其受到关注。它允许第三方应用和服务直接获取京东商城内商品的详尽信息&#xff0c;这对于电商平台、价格比较网站、数据分析公司以及移动应用开发商来说&#xff0c;都是一个宝贵的工具。本文将深…

Clickhouse副本和分片的概念

副本 https://clickhouse.com/docs/zh/engines/table-engines/mergetree-family/replication 副本是表级别的&#xff0c;不是整个服务器级的。所以&#xff0c;服务器里可以同时有复制表和非复制表。 副本不依赖分片。每个分片有它自己的独立副本。 ClickHouse 使用 Apache Zo…