随笔分类 - 搜索
摘要:搜索题意:先给出大方阵的边长,再给出m个小方阵并给出每个方阵的边长,问是否可以不发生重叠地把小方阵放进大方阵中,并且大方阵完全利用没有剩余这题的代码不难写,关键是要找到策略,这题的策略比搜索本身的剪枝更有价值摆放小方阵的策略是,尽可能往上面摆,然后尽可能往左边摆。另外有个策略一开始想错了,我是想先把小方阵排序,先放好大的,再放好小的,这样在摆放过程中可能出问题,画图可知,正确的策略是就目前的摆放情况,能放得到下哪个就放哪个,无所谓大小为了满足尽可能放在左上方的条件,需要记录大方针的状态col[i]的意义是,第i列,从最顶部数下来,被连续占据了多少格注意在整个摆放过程中,每一列都保证是被连续占据
阅读全文
摘要:状态压缩DP + 优先队列BFS题意:给一个矩阵图,图中只有一个*表示起点,#表示不能到达的点,从A开始有k个大写字母(一定是连续的前k个,但是每个字母的个数不一定),一种大写字母表示一种矿石,一个矿石有两个值ai,bi,表示收集这个矿石需要ai电量,另外,在一个矿石点,可以选择收集或者不收集直接走掉,收集后每走一步,需要多加bi的电量,一开始没有任何矿石,每走一步需要1电量,另外,一开始给你P电量。走的方向是上下左右四个方向。你的任务是在电量用完之前,收集到每种矿石(每种矿石只需要1个),然后回到起点,但是注意一点,在没有收集完之前,不能回到起点,因为一旦回到起点就会瞬间传送回基地。如果有的
阅读全文
摘要:基础搜索中文题意不解释,这题没看sample直接看完题目就打,发现不对,才看到数据可能各种无聊的坑1.可能出现相同位置的点,直接判NO2.两个点中,可能一个点是空白点,直接判NO3.两个点的值不同,直接判NO剩下的情况才是值得去搜索的,即两点值相同且都不是空白同BFS去搜定义状态,包括信息有1.x,y即该点在盘中的坐标2.c,从起点走到这里,转弯次数,为0,1,2。 3或以上的已经不行了,直接抛弃掉3.n,方向,从什么方向来到这个点,有0,1,2,3表示上,左,右,下,这样排序方便计算然后每次从当前点往4个方向搜索,并且开一个标记数组来标记哪些状态在队列中,inq[x][y][c][n],耗时
阅读全文
摘要:最短路变形题意:你有K个点数,有N个点,M条边,边为有向边,包含4个信息,两个端点+边长+走这条边需要付出的点数。你的任务是,从1号点出发走到n号点,在点数够用的情况下,走出一条最短路,单case显然是一个最短路的变形,而且是一种常见的模型。最短路本身是一个求解最优解的问题,在这里加多了一个限制条件,就是点数,所以变为“在一定的限制条件下求解一个最优化问题”的模型,这样的模型,可以由一个大致的套路,就是,在满足限制条件后,再进行更新下面将讲3个方法,前两个其实都是BFS,第3个事DFS,是一个记忆化搜索。我们先说BFS1.优先队列+dij(最快) 判断一个元素能否入队,不再是看它的最短路估计值
阅读全文
摘要:隐式图搜索训练的题目,题意:输入n表示串(串为基因,只会出现ACGT)的长度,下面两行长度为n的串,第一个为起始串,第二个为目标串。对串能做两种操作。1.将头元素移动到尾部。2.最前面两个元素交换位置。从起始串到目标串的最少操作次数是多少,输出这题一看,觉得是DP,后来发了两三分钟的样子想到了是搜索。对于当前的串,它是一个状态,通过两个操作,能产生两个新的状态,所以这个过程就可以建图,搜索,找出两点间的最短路。注意这里不是树,因为很容易想到,这个图是可以有环的。另外,可以大致计算到状态数是很多的(串长最大为12),所以不能显式建图,当然也没必要显式建图,因为很多点(状态)是不会去到的很快打出代
阅读全文
摘要:概率题题意:输入case数,每组case两个数字,表示A的点数和B的点数,他们玩游戏,每个人赢的概率都是0.5。输的人要将自己的一部分点数给对方,给的点数是min(na,nb)。例如na=3,nb=2如果A赢了,B要给2点给A,即全部给完。如果B赢了,A要给2点给B,A变为1,B变为4。一个人的点数为0,那么游戏结束了。题目要你输出两个数学期望,第一个是,这个游戏要结束,要玩多少局的数学期望,另一个是A赢的概率这题一开始看觉得是期望DP,后来想想也可以不写DP,能把状态表达出来即可。设一个状态(n,m,c)表示A现在的点数是n,B的点数是m,已经玩了c局。那么游戏结束的状态就是(n,0,c)或
阅读全文
摘要:最短路 OR 搜索这题大多数是归为图论题,求最短路径,看了一下题目,确实是这样的意思,但是我却很难想到怎么最短路。后来觉得搜索更形象易懂所以写了一个dfs,但是wa,然后看了一下解题报告才发现有个地方理解错题意了。根据题意做了小修改就过了题意:其实就是找一条最短路径,但是路径中任意两个点的等价差不能超过限制值(我一开始的理解是两个直接相连的点的等级差不能超过限制值)/*建图:一个物品就是一个点,一个物品能容另一种物品来换,那么就是两个物品间可能相连,为什么是可能,因为还要两个物品的等级满足条件。因为物品数上限为100,用邻接矩阵来建图方便。再注意一点,这是个有向图,要得到i物品可以用j物品来换
阅读全文
摘要:最短路(隐式图搜索)题目是过了,不过时间好慢,用了2.200s。大概是没有用位运算的原因,我是直接模拟的。而解决最短路的问题是用spfa来做(感觉这种思路更加形象和容易理解,并且更符合隐式图搜索的感觉)来说说题意,这个题意都是很长很烦的。首先给出n和m,表示有n个bug和m个补丁。一开始存在n个bug,用1表示一个bug存在0表示不存在,所以一开始就是n个1,我们的目的是要消除所有的bug,所以目标状态就是n个0。对于每个补丁,会给出使用这个补丁的时间,另外会给出两个长度为n的字符串,第一个字符串表示这个补丁适用于什么情况下的bug,第二个字符串表示使用完这个补丁后原来的bug会变成怎么样。先
阅读全文
摘要:近期所做题目中最好的一道,首先是比较创新不是常规的,另外需要比较好的数学功底能够洞察到一些小细节,然后转化方法貌似有很多,我自己想了很多但是都很差劲,最后实在没办法很无耻地找了解题报告,这篇解题报告感觉写得最好,我就是按照他的思路自己写的代码1A,佩服佩服此大神解题报告 http://hi.baidu.com/lixubd/item/1fbebd2c0389700f43634a5f算法思路都在里面了,我就不写了,我自己独立写了代码,加了很多注释,代码虽然比较多(这道题代码本来就多),然后其实不难读懂说明一点,预处理后的矩阵行和列都翻倍了,我的代码行和列都是从1开始标号的,而那位大神的代码都是从
阅读全文
摘要:献上题意:个你一个转轮,有5种颜色,为了5中颜色的位置是确定的,为了方便处理我们用01234来表示绿,黑,红,蓝,白。轮子可以沿着它的方向滚动(只能是它当前的方向不能相反方向),每滚动一次会到达另一个格子,着地的颜色会改变,变了之前颜色的下一个,例如当前是绿色着地下一次就是黑色,依次是红蓝白。也可以原地转动(顺逆时针都可以),原地转动其实就是改变了轮子的滚动方向,原地转动每次能转90度。原地转动一次和滚动一次时间都是1秒。另外轮子有4个方向,上北下南左西又东。另外给你n*m个格子,有些格子不能到达,用#表示,给你起点S和终点T。在起点时轮子方向规定向北,绿色着地,然后滚动到终点,要求绿色着地,
阅读全文
摘要:说白了还是搜索题输入n有n个点,从1到n标号,起点为1,终点为n,下面n行是每个点信息第一个数字是该点所带的能量值,第二个数字是该点的出度m,然后m个数分别是和该店相连的点的标号起点和终点的能量值都是0游戏一开始的能量值是100,没到达一个点,新的能量值等于之前的能量值加上该点的能量值,游戏要求在任何一个的时候能量值都不能小于等于0,问最后能否到达终点另外一个点是可以多次到达的这题不要想复杂了其实很好做当发现有个和为正值的环存在时,直接求看该点能否直接到达终点。如果可以,直接返回true,即winnable。否则,不用做任何的标记。因为不会再去探索它是否可以直接到达终点。在搜索的过程中看看有没
阅读全文
摘要:图的搜索,双重搜索题意:(折腾的UVA又是好难懂的题意),给你一个h行w列的矩阵输入(标准的),注意输出w h,别颠倒过来。然后只有三种点 '*' , '.' , 'X'其中X和*一起称为区域I,在区域I中相连的X称为区域II , 输出就是输出m个数字,其中m就是区域I的个数,这m个数字中第i个数字num[i]表示某块区域I一面又多少个区域II其中相连是两个格子有公共边,只有点不行,所以对于一个格子而言有4个相连的格子,分别就是上下左右另外区域I可能是任意形状的,可以看samplesample中就是有4块区域I左上角的区域I有两个X,但是这个两个
阅读全文
摘要:题目翻译:1976年“四色定理”在计算机的帮助下被证明。 这个定理宣告任何一个地图都可以只用四种颜色来填充, 并且没有相邻区域的颜色是相同的。现在让你解决一个更加简单的问题。 你必须决定给定的任意相连的图能不能够用两种颜色填充。 就是说,如果给其中一个分配一种颜色, 要让所有直接相连的两个节点不能是相同的颜色。 为了让问题更简单,你可以假设:1. 没有节点是连接向它自己的。2. 是无向图。 即如果a连接b, 那么b也是连接a的3. 图是强连接的。就是说至少有一条路径可走向所有节点。方法一:广搜BFS由题目可知,对于每个结点,所有和它相接的点必须和这个点颜色不一样。那么,很自然可以用广搜来做:
阅读全文
摘要:搜索水题,其实就是一个图的遍历(因为放在数据结构图专题中)给你一个图,以一整行的"_________"作为这个图的结束然后"X"表示不能到达,空格是能到达的,"*"也是可以到达的,并且是一个起点,要求从所有的起点出发,能到达的地方都标记为"#"然后输出标记后的整个图,"_______"也是要输出的另外注意这个图不一定是一个矩阵,可能是不规则的,例如XXXXXXXXXX X XX * XX X XXXXXXXXXXX XX XX XXXXXX_____当然这些都是没有关系的,就直接遍历好了,已经标
阅读全文
摘要:题意:一个三维方块,给出高长宽,并且按照从最低面一层(或者从最顶面一层)到最高一层逐层给出这个方块的信息。S表示起点E表示终点,#表示这个格子不能走, .表示这个格子能走,走的方向有6个,前后左右上下。能是否能从起点走到终点,若能输出最少的步数首先想到的DFS+剪枝,后来TLE了,才自己脑子又进水了,应该用BFS,因为剪枝的话效率不高,而且题目求最小步数,显然符合BFS的特点从起点开始,将它能走的6个方向的格子且满足条件的格子入队,满足条件是指,这个格子还在方块内,而且能走,而且没有走过一开始没有记录一个格子是否走过就TLE了,又脑子进水了显然是要记录的………………如果队中某个格子就是终点的格
阅读全文
摘要:简单骑士周游问题,BFS,有障碍物,(可能存在无障碍物的情况),起点和终点不会相同,起点终点无障碍物若能从起点出发到终点则输出步数,否者输入不能到达#include <stdio.h>#include <string.h>#include <queue>#define N 70using namespace std;bool g[N][N];int b;int start,end;struct node{ int n,r,c,k;};queue<struct node> q;int BFS(){ int ans,i,k,R[10],C[10],F
阅读全文
摘要:图论入门题,找多少个八连块,简单的dfs解决//给出一个m*n的矩阵,有些方格染色,一个方格的邻接方格有8个,就是它四周的八个//一个染色的方格的邻接方格中也有染色的话那么把他们看做是一起的,都归为一个八连块//题目要找这个矩阵中有多少个八连块#include <stdio.h>#include <string.h>#define N 110#define M 110bool a[M][N],vis[M][N];int m,n;void dfs(int i , int j){ if(!a[i][j] || vis[i][j]) return ; vis[i][j]=1;
阅读全文
摘要:很简单的骑士周游问题,简单的BFS一个骑士在当前位置的话可以像8个方向走,至于骑士是怎么走的可以百度一下记录起点和终点的行列并算出它的标号(整个棋盘是8*8的,按行优先去编号从1到64,所以每个格子都会有一个唯一的编号)走了8个方向记录下每个方向的编号,每得到一个编号就判断和终点编号是否相同,是的话就已经走到了,跳出,否则的话这个格子入队另外就是记录步数,就是代码中的k另外要注意判断起点和终点相同的情况,都是输出0#include <stdio.h>#include <string.h>#include <queue>#define MAX 70using
阅读全文