搜索
搜索算法
Mr.琛
钻石要琢磨
展开
-
UVA11624--Fire!(BFS)
题意: 一个人被困在迷宫里,迷宫有若干着火点(注意是若干,有可能不只一个着火点),人每分钟可以跑上下左右一个方向的一个单位距离,火每次会往上下左右四个方向全部烧一个单位距离,求人逃出迷宫的最小时间(出迷宫矩阵外就算逃出),要是不行就输出"IMPOSSIBLE". 思路: 很明显是BFS,要是没有火就是一个经典的bfs迷宫问题了。加上着火点的存在后,BFS的方式就变了一下。 刚开始还是想一次BFS,...原创 2020-02-10 16:06:00 · 275 阅读 · 0 评论 -
poj 2676--Sudoku(DFS+回溯)
题意:有t的样例,每个样例会给一个未完成的数独棋盘(数独原理就不解释了吧…每行每列每个小九宫格不能出现重复的数字),编程完成该数独。 思路:这道题比较明显的是一道搜索题,故考虑采用DFS,设置布尔数组来标记每行,每列,每个小九宫格已出现的数字,回溯法来试错(有达到终点的解后则停止回溯)。 这里二维数组不要开9*9(不够大)!!! (调试了我一个晚上啊啊啊!!!改成10 *10就过了!) #incl...原创 2020-01-20 00:06:28 · 210 阅读 · 0 评论 -
poj 1077--Eight(八数码问题,BFS+康托展开+路径打印)
题意:经典的八数码问题,题目已确定好目标状态,若从起始状态到目标状态有解,输出最短的到达路径的每一步操作;否则输出unsolvable。 思路:这是一道经典的八数码问题,采用BFS+康托展开判重,主要多了一步打印路径,把可变化位置x看成数字0放置位置,共有9个数字,即9!种状态,在数组可开的范围内,用pre结构体记录当前状态的前驱状态即转化过来的方式,再用栈倒过来打印答案即可。(BFS时用STL中...原创 2020-01-15 16:41:24 · 467 阅读 · 0 评论 -
POJ 3414 --Pots (BFS+路径输出)
题意: 你有两个罐子,容量分别为a,b;开始时都没水,要通过给定的三种操作,使得其中一个罐子的水量恰好为c,若存在操作使之成立,输出最少操作数及对应的每步操作;否则输出impossible。 思路: 由于a,b,c的范围很小为1到100且要求最小操作数,故考虑采用bfs,即搜索可能的情况若有到达其中一个罐子里的水为c的情况则搜索结束并输出路径,否则直到队列为空后输出impossible。 对于路径...原创 2020-01-14 20:09:13 · 384 阅读 · 0 评论 -
POJ 3278--Catch That Cow(BFS)
题意:农夫和牛都在一个一维坐标上(0<=x<=100000,这个范围可以用来搜索时剪枝),设农夫坐标为x,每单位时间农夫可以选择到x-1,x+1或者2*x处,而牛不动,求最小时间。 由于是求最短时间,故考虑使用bfs,问题可抽象为起始点s到目标点e按上述步骤的最短时间。 剪枝: (1)出了范围的坐标就不要再进队了(因为即使还可能回来,对于那三种操作,也不如在范围内的距离较小的点时间优)...原创 2020-01-13 17:32:54 · 123 阅读 · 0 评论 -
POJ 3984 迷宫问题(bfs + 最短路径打印)
题目:POJ3984,从左上方起点到右下方终点寻找最短路径并打印 #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std;//含有路径记录,vis在路径记录中存在作用,故不能简单的设为0,1; int mp[10][10];...原创 2019-07-30 10:45:21 · 349 阅读 · 0 评论 -
HDU1078--FatMouse and Cheese(dp+dfs,记忆化搜索)
题意:老鼠从(0,0)开始,每次只能往上下左右其中一个方向最多走k步,且每次走到的格子的数字要严格大于当前格子,问能走到的所有数字的和最大是多少。 纯搜索会超时,用dp数组结合dfs进行记忆化搜索,大大减少了无用计算。 dp[i,j]表示从当前格子出发最多能获得的最大值,初始化dp数组为0,每次遍历到点的dp[i,j]不为0时,该点无需再遍历,直接取dp[i,j]的值即可,因为深搜(“不撞南墙不回...原创 2019-08-14 19:24:40 · 196 阅读 · 1 评论 -
HDU 2141--Can you find it?(二分查找基础好题)
题意:能不能从给定的三个序列中找出满足ai+bj+ck==给定的x值,能则输出YES,否则输出NO。 思路:暴搜绝对会超时,由于区间长度为静态,考虑排序后二分(二分的前提一定是有序)。二分有两种选择,其中一种会超时:1.在c中二分查找 x-a[i]-b[j] 是否存在,那么时间复杂度为n * m * log( p )(设a,b,c数组的长度为n,m,p),会超时; 2.还有一种更好的方法,先预处理...原创 2019-08-16 19:02:26 · 257 阅读 · 0 评论 -
2019牛客暑期多校(D--Knapsack Cryptosystem)(折半查找)
题意:从n个数中选出若干个数使得和为给定值m,题目保证有解。 由于n最大为36,直接搜索2^36次方肯定TLE,但对于区间的一半即18,2 ^18则可以,故应该得想到把区间折半,先计算出前半区间各种组合情况的和,在枚举后半区间各种情况的和sum在前半区间中找m-sum是否存在。 法一:set+map #include<cstdio> #include<cstring> #i...原创 2019-08-16 19:54:56 · 100 阅读 · 0 评论