福州夏令营第二天

2024-01-12 13:48
文章标签 第二天 夏令营 福州

本文主要是介绍福州夏令营第二天,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    今天已经是第二天了,今天我们学习了BFS,说是学习,不如说是复习吧,但也收获了很多。除了BFS外,我们还学了一些深度优先搜索的剪枝,这真的是一样非常玄学的东西。讲了一些的题目,有一些题目非常的简单,我以前的基础是可以完全理解并解决的。但同时,我们也讲了一些难题,这一些题目当时讲得时候我可能有一些茫然,所以课后,就不得不去自己思考一下了。

    先讲一道BFS的题目吧,这是我们的老师先抬出来的,可以说是学BFS的基础题吧。

    骑士救公主(题目忘了,救勉强来凑合一下吧)

    题目描述大概就是一个骑士(R)要在一个n*m的方格中移动到公主的位置(A),每一次移动都需要花费1的时间,这个方格内还有非常多的不能通过的墙(#),普通的道路(.)。同时,一路上还有非常多的守卫(R),骑士移动到守卫的位置必须打败守卫,但需要消耗1的时间。求最短的时间。如果无法到达,就输出NO。

    冷静分析:

    竟然是找最短的,那么求的一定是最优解。我们的BFS正是用来求最优解的大宝贝。但是如果用DFS一条路走到黑的话,时间复杂度太高,会用大把的时间来走错误的路,最后的结果也就可想而知(嘿嘿嘿)。知道了算法,那就好办了。

    老师给我们讲了一遍,不过我觉得老师讲得很清晰,但是我还是想要用自己的方法:我们可以把整个方格用int类型存储起来,如果是墙的话,就记为0,如果是骑士,普通的路或者公主的话,就记为1,如果是守卫的话,就记为2。每次通过时,如果当前的值>=1,就说明不是墙,那么就把当前的值加起来。当然,我们先要初始化一下,把四周的不能走的地方记为0。

    代码如下:

#include<bits/stdc++.h>
using namespace std;int n,m,k,a[200][200]={0,0},vis[20000]={0},x[1000]={0},y[1000]={0},xx,yy,dx[5]={1,-1,0,0},dy[5]={0,0,1,-1};
char b[200][200]={};void bfs()
{int tail=1,head=1;while(tail>=head){for(int i=0;i<=3;i++){int xxx=x[head]+dx[i],yyy=y[head]+dy[i];if(a[xxx][yyy]>=1){tail++;vis[tail]=vis[head]+a[xxx][yyy];a[xxx][yyy]=0;x[tail]=xxx;y[tail]=yyy;}if(xxx==xx&&yyy==yy){cout<<vis[tail];return;}}head++;}cout<<"NO";
}int main()
{cin>>n>>m;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){cin>>b[i][j];if(b[i][j]=='.')a[i][j]=1;else if(b[i][j]=='R')a[i][j]=1,x[1]=i,y[1]=j;else if(b[i][j]=='A')a[i][j]=1,xx=i,yy=j;else if(b[i][j]=='S')a[i][j]=2;}bfs();return 0;
} 
    注释就不加了,老师说加注释很麻烦的。。。

    这样就可以过了。


    另外,我们也要来一道深搜的剪枝。就举老师讲得小木棍吧。(欢迎来到乱七八糟忘记题面,所有题目全靠乱编

    这题大概就是把几个数分成几组,要使每组的和最小。(好像也太简略了)
    胡乱分析:
    既然是胡乱分析,也不多说了。这一题暴力的裸搜是非常容易的,最重要的就是剪枝剪枝剪枝!!!这一题我们可以正着剪,倒着剪,甚至还能瞎几把乱剪。但是我非常蒟的,我就只能正着剪,倒着减,优化两个地方,不过会瞎几把乱剪。代码具体就不给了,毕竟体面真的忘了。。。反正剪枝这东西真的非常玄学,一不小心把正确答案剪掉了就GG了。
    学了两天搜索,这一方面的基础应该可以说是有底了,温故而知新可能真的是非常正确的吧。

这篇关于福州夏令营第二天的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/598068

相关文章

Java基础回顾系列-第二天-面向对象编程

面向对象编程 Java类核心开发结构面向对象封装继承多态 抽象类abstract接口interface抽象类与接口的区别深入分析类与对象内存分析 继承extends重写(Override)与重载(Overload)重写(Override)重载(Overload)重写与重载之间的区别总结 this关键字static关键字static变量static方法static代码块 代码块String类特

idea插件开发的第二天-写一个时间查看器

介绍 Demo说明 本文基于maven项目开发,idea版本为2022.3以上,jdk为1.8本文在Tools插件之上进行开发 Tools插件说明 Tools插件是一个Idea插件,此插件提供统一Spi规范,极大的降低了idea插件的开发难度,并提供开发者模块,可以极大的为开发者开发此插件提供便利Tools插件安装需要idea2022.3以上版本插件下载连接: https://downlo

第二天旅游线路规划和预览

第二天:从克拉玛依市乌尔禾区到五彩滩,晚上住宿贾登峪; 规划结果见下图: 1、行程安排 根据上面的耗时情况,规划一天的行程安排如下: 1)早上7:30起床,吃完早饭,8:30出发; 2)从克拉玛依市乌尔禾区到五彩滩风景区,路程229公里,车程3小时,中午12:00左右到达五彩滩景区; 3)中午吃饭1小时; 3)五彩滩游玩时间约3小时,在五彩滩游玩到16:00; 4)乘车前往阿勒泰地区布尔津县

【深度学习详解】Task2 分段线性模型-引入深度学习 Datawhale X 李宏毅苹果书 AI夏令营

前言 《苹果书》第一章的内容包括 机器学习基础 -> 线性模型 -> 分段线性模型 -> 引入深度学习 这一篇章我们继续后续内容 ~ 其中涉及到“激活函数”的作用理解: 除了 开源项目 - 跟李宏毅学深度学习(入门) 之外, 还有 @3Blue1Brown 的神经网络 和 @StatQuest 的深度学习 视频内容辅助。 🍎 🍎 系列文章导航 【深度学习详解】Task1 机器学习基础-

Datawhale X 李宏毅苹果书 AI夏令营 - 跟李宏毅学深度学习(入门之线性模型)

文章目录 一、线性模型是什么?二、线性模型的特点三、简单举例理解3.1、预测未来某一天点击量3.2、分段线性曲线 总结 一、线性模型是什么? 在深度学习中,线性模型是一种简单但基础且广泛应用的数学模型。它的基本形式是一个线性方程,如y = wx + b,其中y是预测输出,x是输入特征,w是权重参数,b是偏置项(也称为截距)。 线性模型假设输入与输出之间存在线性关系,即输出是输

寒假集训第二天——线性表

现在时间是北京时间1点23分,第二天集训。。。 昨天花了老长时间把线性表看了下,表示很有压力,不大会用。。。 先说下我学到的线性表的皮毛。。。 首先是链表的构建,构建有两种方式: 顺序链表(尾插法建单链表) #include<stdio.h>struct node{int date;struct node *next;};int main(){int i,n;node *he

【无标题】【Datawhale X 李宏毅苹果书 AI夏令营】批量归一化

1、批量归一化的作用 批量归一化(Batch Normalization,BN)的把误差曲面变得平滑,使训练能够得到快速收敛; 训练过程的优化:使用自适应学习率等比较进阶的优化训练方法; 训练对象的优化:批量归一化可以改变误差表面,让误差表面比较不崎岖 参数 w i w_i wi​是指训练参数或者训练的目标 1.1 特征归一化 当输入的特征,每一个维度的值,它的范围差距很大的时候,我们就可能

Datawhale X 李宏毅苹果书 AI夏令营-深度学习基础-Task3

# Datawhale AI 夏令营 夏令营手册:向李宏毅学深度学习 批量归一化 如果误差表面很崎岖,它比较难训练。而**批量归一化(Batch Normalization,BN)**的作用是把误差表面变得平滑,能够更好地训练。 在一个线性的的模型里面,当输入的特征,每一个维度的值,它的范围差距很大的时候,我们就可能产生像这样子的误差表面,就可能产生不同方向,斜率非常不同,坡度非常不同的误