自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 人物动作碰撞检测相关

在官方资源商店找素材的时候看了一下作者的脚本里关于“人物是否在地面上、是否碰到了墙壁”的检测是如何实现的。(人物只能跳一次,在贴到墙上的时候会播放滑墙动画)。作者在人物身上挂了五个只带有碰撞器和相关脚本的子物体,分别是以人物为中心在周身围成矩形的四个,和人物脚底下名为“GroundSensor”的一个。它们挂的都是同一个脚本。在脚本中,每个碰撞器触碰到物体的时候,就会把名为m_ColCount的int变量+1,如果离开物体,则把这个值-1,随后在名为State的返回值bool类型函数中,返回m_ColCou

2022-06-04 18:15:41 222

转载 unity实现动作游戏连招/连击

unity实现 动作游戏的连招/连击 - 三页菌 - 博客园

2022-05-31 18:12:10 773

转载 AcWing 4262 空调

Farmer John 的N头奶牛对他们牛棚的室温非常挑剔。有些奶牛喜欢温度低一些,而有些奶牛则喜欢温度高一些。Farmer John 的牛棚包含一排N个牛栏,编号为1…N1…N,每个牛栏里有一头牛。第i头奶牛希望她的牛栏中的温度是pi,而现在她的牛栏中的温度是ti。为了确保每头奶牛都感到舒适,Farmer John 安装了一个新的空调系统。该系统进行控制的方式非常有趣,他可以向系统发送命令,告诉它将一组连续的牛栏内的温度升高或降低1个单位——例如「将牛栏5…8...

2022-05-29 22:30:33 177

原创 位运算相关

位运算最常用的两种操作1.n的二进制表示中第k位是几(个位是第0位)。①先把第k位移到最后一位 n>>k②看个位是几(x&1,如果是1就是1,否则是0)2.lowbit(x)操作:返回x的二进制表示中最靠近右边的一位1以及其之后的数。例:lowbit(1001000)=1000.①如何实现:x&-x(也可以写为x&(~x+1))②原理:在c++里面,一个整数的负数是以补码的形式存在,即x的原码取反加一(~x+1)。比如x=1010....1

2022-05-29 18:32:02 117

转载 蒙德里安的梦想

题目描述n×mn×m的棋盘可以摆放不同的1×21×2小方格的种类数。题型状态压缩dp更新2022年5月19日16点36分更新增加适当的空格和换行,愉悦读者体验。带有图示的题解Acwing291. 蒙德里安的梦想:状态压缩dp_阿正的梦工坊的博客-CSDN博客C++ 代码/*下文对 if ((j & k ) == 0 && st[ j | k] ) 有清晰的解释!!!*/#include <bits/stdc++.h>..

2022-05-26 22:10:09 121

原创 记忆化搜索

给定一个 RR 行 CC 列的矩阵,表示一个矩形网格滑雪场。矩阵中第 ii 行第 jj 列的点表示滑雪场的第 ii 行第 jj 列区域的高度。一个人从滑雪场中的某个区域内出发,每次可以向上下左右任意一个方向滑动一个单位距离。当然,一个人能够滑动到某相邻区域的前提是该区域的高度低于自己目前所在区域的高度。下面给出一个矩阵作为例子:1 2 3 4 5​16 17 18 19 6​15 24 25 20 7​14 23 22 21 8​13 12 11 10 9...

2022-05-26 21:02:57 76

原创 区间DP相关

1.石子合并设有 NN 堆石子排成一排,其编号为 1,2,3,…,N1,2,3,…,N。每堆石子有一定的质量,可以用一个整数来描述,现在要将这 NN 堆石子合并成为一堆。每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。例如有 44 堆石子分别为 1 3 5 2, 我们可以先合并 1、21、2 堆,代价为 44,得到 4 5 2, 又合并 1,21,2 堆,代价为 99,得到 9 2 ,再合并

2022-05-26 21:01:22 61

原创 一些线性DP

闫式DP法,尝试用集合来表示状态。1.数字三角形给定一个如下图所示的数字三角形,从顶部出发,在每一节点可以选择移动至左下方或者右下方,一直走到底。要求找出一条路径,使得路径上的数字和最大。用暴搜会超时。使用DP时,我们需要寻找变化的点并且把它表示出来。这里我们选择从下往上的路线行走,那么对于每个节点,他的不同在于是从他的左下方来到他本身还是从右下方。用二维坐标来表示的话,到达(i,j)的方法有两种,从(i+1,j)或者(i+1,j+1),我们只要取其中较大者即可。.

2022-05-26 21:00:11 105

原创 一点点图论相关(二)

1.spfa算法SPFA算法_善思的博客-CSDN博客_spfa算法3.Floyd算法求多源最短路。用邻接矩阵把图存下来,然后三重循环。第一重循环,k从1到n,第二重循环i从1到n,第三重循环j从1到n。每次更新一遍。d[i][j]=min(d[i][j],d[i][k]+d[k][j]);循环之后,di存的就是从i到j的最短路径长度,原理基于动态规划。d[k,i,j]表示从i出发,只经过1~k这些中间点到达j的最短距离。循环中首先枚举k,因为k表示阶段3.Prim算法求最小

2022-05-26 20:53:14 284

原创 一点点图论相关(一)

一.有向图的拓扑序列就是图的宽度优先遍历的应用。什么是拓扑序列?如果一个点的序列满足对于图中的每条有向边xy(x、y是两个点),x都出现在y的前面(即起点都在终点前面),便称该序列为拓扑序列。一个有向无环图一定存在拓扑序列。这种图又称拓扑图。有向图中每个点有两个度。入度:有多少条边指向自己。出度:自己延伸出多少条边指出去。所以所有入度为0的点都可以作为起点。把它们入队。然后进行宽搜二.Dijkstra求最短路(一定不能存在负权边)1.朴素版:1.首先初始化距离dis[1]=0

2022-05-26 20:48:21 517

原创 1.角色行动与方向控制

黑魂复刻想法的出现是沉迷魂3的后果,同时有一段时间没有摸unity所以想复健一下。参考了傅老师在b站的unity黑魂复刻教学,同时加入了我自己的一些想法和改动,希望能通过这次复刻学到更多的东西。[傅老師/Unity教學][4/27中午更新] DarkSouls複刻經典教程#第一季_哔哩哔哩_bilibili控制移动:以前关于方向控制我是直接这么写的但是傅老师用了另一种方法,虽然效果都是一样的,但是让我学到了更多的可能性其中Dmag是给动画状态机混合树的float值设定...

2022-04-25 22:30:12 1738

原创 LeetCode 91 解码方法

一条包含字母A-Z 的消息通过以下映射进行了 编码 :'A' -> "1"'B' -> "2"...'Z' -> "26"要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,"11106" 可以映射为:"AAJF" ,将消息分组为 (1 1 10 6)"KJF" ,将消息分组为 (11 10 6)注意,消息不能分组为(1 11 06) ,因为 "06" 不能映射为 "F" ,这是由于 "6" 和 "06" 在映射中并不...

2022-03-27 14:36:43 119

原创 LeetCode 5.最长回文字串

自己想没想出来,先贴一个官方的题解,看是看懂了回头再琢磨一下力扣

2022-03-26 21:58:43 94

原创 LeetCode62 不同路径

一个机器人位于一个 m x n网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例 1:输入:m = 3, n = 7输出:28示例 2:输入:m = 3, n = 2输出:3解释:从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> 向下 -> 向下2. 向下 -> 向下 -> 向右3. ..

2022-03-25 20:48:00 72

原创 LeetCode 55 跳跃游戏+45 跳跃游戏II

给定一个非负整数数组nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例1:输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。示例2:输入:nums = [3,2,1,0,4]输出:false解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达...

2022-03-25 20:01:40 115

原创 LeetCode 213 打家劫舍II

题目描述你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。示例1:输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 =.

2022-03-25 18:26:27 80

原创 LeetCode 90.子集II 笔记

子集II因为子集中存在相同元素,所以要思考如何去重的问题。贴个题解链接https://leetcode-cn.com/problems/subsets-ii/solution/90-zi-ji-iiche-di-li-jie-zi-ji-wen-ti-ru-djmf/class Solution {private:vector<vector<int>> result;vector<int> path;void backtracking(v

2022-03-22 22:03:41 76

原创 树与图的深度、广度优先遍历

二十二.树与图的深度遍历从一个起点出发一条路遍历到黑,如果到头了就回溯检查是否找过了所有的路,没有就从分叉口继续走。//基本框架int h[N],e[M],ne[M],idx;bool st[N];​void dfs(int u){ st[u]=true;//标记一下已经被搜索过了 for(int i=h[u];i!=-1;i=ne[i]){ int j=e[i]; if(!st[j]) dfs(j); }}给定...

2022-02-11 19:28:19 247

原创 BFS相关

二十一.BFS宽度优先搜索 可以搜索到最短路。只有当边权都是1时才能使用因为宽搜是先从最近的搜起,如果不符合则慢慢往外搜索。给定一个n*m的二维整数数组,用来表示一个迷宫,数组中只包含0或1,0表示可以走的路,1是墙壁。最初,一个人位于左上角(1,1)处,已知该人每次可以向上下左右任意方向移动一个位置,则他移动到右下角(n,m)处,至少要移动多少次。数据保证(1,1)和(n,m)处的数字为0且一定至少存在一条通路每搜索出一格能够行走的新路,都加“一层”,然后继续搜索直到搜索到终点

2022-02-11 19:26:51 251

原创 DFS相关

二十.DFS深度优先搜索 俗称暴搜,最重要的是顺序。给定一个数字n,要求输出1到n所有数字的全排列,按照字典序输出假设有三个数字,我们设定有三个空,接下来要做的就是依次把三个空填上。假设一棵树,每填好一个空,树就往下延伸枝丫。当所有的空都填完了,就往回回溯。回溯的时候记得把所有用过的数都拿出来。填空的时候,我们需要知道当前位置可以填上哪些数,即知道哪些数已经被用过了。#include<iostream>​using namespace std;​const

2022-02-11 19:26:09 314

原创 手写模拟一个堆

十九.模拟堆如何手写一个堆?堆是维护一个数据集合。STL堆直接支持的三个操作1.插入一个数2.求集合当中的最小值3.删除最小值我们手写的还可以直接做:1.删除任意一个元素2.修改任意一个元素堆是一个完全二叉树。除了最后一层外,他的所有节点都是非空的,最后一层从左到右依次排布。且从下到上,数逐渐变小,根节点一定是堆中的最小数。堆的性质:以小根堆为例,每个节点的值小于他两个儿子点的值存储方式:用一个一维数组。1号点为根节点,节点x的左儿子下标为2x,x的右儿子下标为2

2022-02-11 19:25:23 179

原创 并查集相关

十八.并查集快速的处理:1.将两个集合合并2.询问两个元素是否在一个集合当中基本原理:用树的形式来维护所有的集合。每一个集合的编号是根节点的编号(想象一棵由一个点延伸出很多杈的数,而第一个点就是根节点)。对于每一个节点x,都存储其父节点p[x]是谁。当想求某个点属于某个集合时,通过找父节点快速找到根节点,其编号就是集合编号。根节点的父节点设置为其自身。问题1:如何判断是否是树根? if(p[x]!=x)问题2:如何求x的集合编号。while(p[x]!=x) x=p[x]

2022-02-11 19:24:15 150

原创 用数组模拟链表

十六.用数组模拟链表如果用结构体和指针来实现链表,效率其实不如用数组,笔试题中很容易超时。1.单链表在笔试中用的最多的是邻接表。邻接表的运用是存储图和树。用数组来模拟,首先定义一个数组存储链表表示值的部分。可定义为value[N]或者e[N],用另一个数组表示指向下一个节点的指针可记为ne[N]。e和ne用下标关联起来。ne里面存的也是下标。如果下一个不存在则存-1#include<iostream>​using namespace std;​const int

2022-02-11 19:23:13 450

原创 模拟栈和队列

十四.模拟栈和队列用数组来模拟栈和队列。栈:先进后出。后插入的元素会被先弹出来队列:先进先出,先进的元素会被先弹出来#include<iostream>​using namespace std;​const int N=100010;​int stk[N],tt;//stk一般用来表示栈,tt表示下标stk[++tt]=x;//在栈顶上插入一个元素。从1开始插tt--;//弹出if(tt>0) //判断栈是否为空,如果未true则不空,否则空stk[t

2022-02-11 19:22:03 262

原创 区间合并相关

十三.区间合并比如说有两个区间,如果他们有交集(端点相同也算),则将两个区间合并为一个区间输入n个区间,将这n个区间中所有有交集的区间进行合并,并输出合并后的区间个数1.按照左端点从小到大的顺序“扫描”所有区间2.先选定当前所扫描到的第一个区间为维护区间,设该区间为A左端点st,右端点ed。当扫描到第二个区间时,设为B。B相对A有三种情况①B的左端点和右端点都比A的小。则A包含B,两者合并②B的左端点比A小,右端点比A大,则A跟B取为并集以上两种情况,A和B合并后统一为当前维

2022-02-11 19:20:24 86

原创 双指针算法

十二.双指针算法一般只有两大类。一大类是两个指针分别指向两个序列(比如归并排序),另一大类是两个指针指向一个序列(比如快排)。最核心思想是用来优化。比如有时需要用二重循环来解决的问题,其时间复杂度为O(n²),用了双指针可以优化到O(n)。一般的通用模板(这里只是举个例子并不是完全一样的):for(i=0,j=0;i<n;i++){ while(j<i&&check(i,j)) j++;//j不能越界且i,j满足某一条件时 //接下来每道题的具体...

2022-02-11 19:19:19 625

原创 前缀和相关

十一.前缀和一维如果有一个长度为n的数组,前缀和数组Si表示为原数组中前i个数组的和。注意前缀和中下标一定要从1开始。1.如何求Si①用for循环从i=1开始,S[i]=S[i-1]+a[i]2.求Si的作用:可以快速的求出原数组中一段数的和。二维(子矩阵的和)S[i,j]的含义:从第1行到第i行的前j列的和。1.如何去算?一行行的去算。S[i,j]=S[i-1,j]+S[i,j-1]-S[i-1,j-1]+a[i,j]可以画图思考,其中减去的部分是被加了两次的部

2022-02-11 19:17:41 248

原创 高精度计算

十.高精度(大整数每一位存到数组里,第一个存个位)可视为模拟人工计算的过程1.高精度加法A+B(两个大整数相加,位数一般是1e6)其实是模拟人工加法的过程。用t表示相加的进位。#include<iostream>#include<vector>​using namespace std;​const int N=1e6+10; ​vector<int> add(vector<int> &A,vector<int&gt

2022-02-10 16:43:19 385

原创 二分法(整数和实数的二分)

是acwing的听课笔记九.二分法(整数和实数的二分)1.整数二分本质:如果有单调性一定可以二分。但是能二分的题目不一定都要二分,所以二分本质并非单调性。如果给定一个区间,可以找到一种区间使得范围能够被一分为二,则可以通过二分法寻找边界。假设左区间为红色,右区间为绿色。【五】给的两个二分模板即对应查找红或绿的情况。红色情况:设定中间值 mid=(l+r+1)/2。mid可以取到边界点//表示检查mid是否满足给定的红色性质,true表示满足,否则falseif(check(m

2022-02-10 16:42:09 853

原创 逆序对的数量

八.逆序对的数量当前一个数比后一个数严格大(即不会相同)的时候,就称两个数为逆序对也用到了分治的思想。首先看归并的基本思想:1.将整个区间一分为二。[L,R]=>[L,mid],[mid+1,R]2.递归处理两个子区间3.归并两个序列然后将所有可能存在的逆序对视为三大类。1.两个数同时出现在左区间2.同时出现在右半边3.一个左一个右。接下来分情况讨论(假设归并的同时能统计三种情况,则逆序对数量为三种情况的数量之和:1.第一种情况:左半边内部逆序对数量,其个数应为me

2022-02-10 16:39:45 1149 7

原创 归并排序算法

七.归并排序(思想也是分治,但是与快排不同归并确定的分界点是整个数组的中心,是下标(即长度 的中心,然后先递归两边,得到左右两个有序数组,最后归并得到一个有序数列。其难点在于最后如何将两个数组合二为一:双指针算法。用两个指针分别指向两个有序的数组,然后再开一个新的数组。比较两个指针指向的元素,将较小者放进数组。直到某一个数组走到尽头,就把另一个数组剩下的数都补进新开的数组里。当上下两个指针指向的数都一样时,一般将上一个数放进数组。#include<iostream>usin

2022-02-10 16:38:47 160

原创 快速选择算法

六.快速选择算法(在一个数组里查找第k小的数字在一个数组里实现快速选择。首先执行快速排序的前两步,得到以分界点为界的左右两个区间,然后比较左区间中数的个数与k的大小,如果小,说明第k小的数在左区间里面,反之则在右区间里面,此时只要对左区间或者右区间进行递归快速排序即可。#include<iostream>using namespace std;const int N=100010;int n,k;ing q[N];intquick_sort(int l,int .

2022-02-10 16:37:59 200

原创 反转字符串

四.反转字符串给出一个字符串并输入n,要求将n个字符放到原本字符串后面第一时间想到的做法基本都是,循环内读取前n个字符一一加到后面然后删除前面,但是这样涉及到的时间复杂度是O(n),所以有更好的做法可以优化到时间O(1)空间O(n)即先整体反转,再将前size-n个字符和后面n个字符看做两部分分别反转class Solution{ public: string leftRotateString(string str,int n){ revers

2022-02-10 16:36:42 123

转载 回形顺序打印

输入一个n行m列的矩阵,从左上角开始将其按回字形的顺序顺时针打印出来#include <iostream>#include <algorithm>using namespace std;int main(){ int n, m; int arr[50][50]; cin >> n >> m; for (int i = 0; i < n; i ++ ) for (int j = 0; .

2022-02-10 16:35:17 242

原创 一些背包问题

三十二.01背包问题动态规划算法(DP)_那什-CSDN博客_dp算法这里是动态规划算法的一篇博客,讲得比较基础而且容易理解。其实我之前理解一直有误,这里换一种说法解释一下方便理解。f[i][j]指的是在有i件物品和j容量的情况下。这里一定要注意j表示的不是当前的剩余容量而是当前总的容量是多少!由此可得当状态转移时,f[i-1][j-w[i]]指的是当有i-1件物品时容量为j-w[i]的情况,也是在当时情况下取得的最大价值!在二维数组dp的方法中进行初始化,一开始只有f[0][0]是合法

2022-02-10 16:31:20 580

原创 快速排序算法

一.快速排序1.随机确定一个分界点作为x2.调整范围:把比x小的数字放到x左边,比x大的放x右边,用两个指针来实现,先用i 指针从左边第一个数开始移动,直到碰到比x大的停止,再把指向右边第一个数的j 指针向中间移动,直到碰到比x小的停止,然后把i和j指向的数交换,交换完后两个 指针向中间移一位3.递归对两边进行排序#include <iostream>using namespace std;const int N=1e6+10;int n;int q[N];​voi

2022-02-10 16:24:38 177

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除