随笔分类 - BFS-广度优先搜索
速度相对DFS快了不少,特点逐层暴力求解。
摘要:题意:链接分析:每一个D或者是E点往四面延伸,并且赋一个特殊的值,能看到D点的点赋值为1,能看到E点的点赋值为1000,这是因为最多100步,因此最后可以根据除以1000和对1000取模来得出某个状态的值,那么这个数值对应的状态就有四种,BFS搜索即可。之前没有考虑到折回这种情况,原因就是状态没有进行完全的搜索。后面看了网上的写法中多是直接开设了四维的一个状态,只需记录某状态走还是没走,也就没有这种折回的考虑了。#include #include #include #include #include #include using namespace std;const int N = 105;
阅读全文
摘要:题意:给定N*N的网格,从某一点出发,问经过T时间后能够出现的位置有多少个?解法:由于从一个点出去后可以原路返回,所以我们只需要记录某个点在T时刻内能否在奇时刻或是偶时刻到达。最后统计一下奇数和偶数时刻到达各点的情况。注意如果8个方向都没方法行走,那么就呆在原地。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>#include <iostream>#include <queue>using namespace std
阅读全文
摘要:题意:问给定的一张图中,相距最远最远的两个点的距离为多少。解法:直接对每一顶点搜索一遍即可。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>#include <iostream>#include <string>#include <map>using namespace std;int N, M;const int INF = 0x3f3f3f3f;map<string,int>mp;stru
阅读全文
摘要:题意:给定一个数N(1<=N<=10000),求N的一个最小的倍数能够被N整除。解法:粗看起来题意简单,但是确无从下手,其实正确的解法就是通过搜索来搞定,由于N不太,因此N的余数类也不会很大,采用从小到大的枚举策略能够使得后面达到的同余类状态不及前面的优秀,这样就能够在非常短的时间内找到答案。bfs过程中对于在状态与状态之间建立前驱指针,这样就能够输出最后的结果。一个状态需要记录以下值:1.当前状态对N的余数;2.当前放置的数字;3.前驱指针。状态之间的转移:mod' = (mod*10 + digit) % N从1位开始依次枚举,然后扩大到2位,3位.....代码如下:#
阅读全文
摘要:这题让我想起了杭电的那一道三个可乐罐的题目,那一题好像只要输出次数就可以了,而这里则需要将所有的路径全部输出出来,这样的话,单纯的BFS则会在状态的保留上会出现大量的空间冗余。于是这题在考虑到搜索空间一定的情况下,并且这些空间具有只访问一次的特性,因此,可以直接对题目进行构图,也就是相当于BFS中不对队列进行删除元素。通过一个二维数组来存储传递路径,再通过一个二维数组来存储父亲结点。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <queue>#include
阅读全文
摘要:题意:给定一个N*M的矩阵(注意N和M的关系),其中0,1,2,3分别代表了不同的意义,现在一个小球从2出发,要到3那个点去,问最少的滚动次数是多少?小球的滚动遵循以下规则,初始位置视为静止状态,只要在静止状态,那么小球可能选择上下左右四个方向相邻没有1(且没有超出整个棋盘的边界)的位置进行移动,一旦选择一个方向,那么就暂时不能够更改方向,直到有一个1挡住了小球。当小球碰撞到了1,那么1变成0,小球又变成了静止态。解法:每个状态我们记录被碰撞过点点,这样就能够检测小球碰到1时是否在这条路径中已经被碰撞过。保留状态bfs即可。代码如下:#include <cstdlib>#inclu
阅读全文
摘要:这一题是给定一个N,求一个最小的数M满足M^2%10^k = N,也就是M的平方的后面与N相同位数的数字的值为N。对于这一题,我的思路就是BFS搜索,对于每一位,假设出一个数来使得其平方的结果逐步的逼近最终的结果。代码如下:#include <iostream>#include <cstdlib>#include <cstdio>#include <queue>#include <algorithm>using namespace std;// 假设N是一个5位数,那么最差情况时是由1个大于等于5位数的数的平方得到的// 否则的话,就
阅读全文
摘要:先生成蛇型矩阵,然后再筛选出素数进行标记,最后bfs。这里要注意题目要求的1-10000的之间的数路径,但是并不代表我们只要打印到这个范围的素数,因为很可能边沿的点需要走到外面的图形来完成对短路,外围的也不要打印太多,毕竟素数的个数越到外面是越稀疏的,所以打印到40000足矣。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>#include <map>#define MAXN 40000using namespace std;i
阅读全文
摘要:跟杭电的奇怪的楼梯非常想。代码如下:#include <cstdio>#include <queue>using namespace std;struct Node{ int x, t;}e[100005], pos;int N, K, front, tail, hash[100005];void getnewpos(int x, int a[]){ a[0] = x - 1; a[1] = x + 1; a[2] = x << 1; }int bfs(){ memset(hash, 0, sizeof (hash)); hash[N] = 1; ...
阅读全文
摘要:就是将普通的二维推广到三维,方向变成了六个。代码如下:#include <cstring>#include <cstdio>#include <cstdlib>using namespace std;int L, N, M, sx, sy, sz; struct Node{ int x, y, z, t; }e[100005], pos;int front, tail, dir[6][3] ={ 0, 1, 0, 0, -1, 0, 1, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, -1}; // 六个方向,三个坐标 cha...
阅读全文
摘要:之前有听说如果在一个迷宫中一直沿着某一堵墙走的话,那么一定可以走出这个迷宫,这题讲的就是这个内容。这题的问法比较奇怪,问你沿着左边的墙,右边的墙走所花的时间和最少所花的时间。该题难点就在与如何让dfs的时候能够沿着墙走。其实是有规律的,那就是往左边走是顺时针方向dfs,往右走逆时针方向走dfs,每次要确定上一次来的方向,这样能够确定你第一次试探的方向是那个方向。例如:如果从最左边的墙进入的话,那么首先选择往上走,否则向前走,再否则向下走,最后还是没法走的话就向左走(往回走),走了之后就直接return,每次走了之后绝对不会再换方向搜索。这题竟然错在了手写的找最短路的队列上。代码如下:#in..
阅读全文
摘要:该题题义是某个人从S点出发,去寻找所有的A,他可以直接到达每个A,也可以通过分身来到达,具体视那种方法所走的路程短而定。换句话说就是可以从A点再走到A点来寻找下一个A,而不选择再从S出发。首先将任意两点之间(A或者S)的距离求出来(通过BFS)然后再建立最小生成树即可。注意输入数据中x,y后面不只一个空格。代码如下:#include <cstring>#include <cstdlib>#include <cstdio>#include <cmath>#include <algorithm>#include <queue>
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=1172这题要换个思维,不要想着如何通过已有的条件来得到正确的值,而是枚举0000-9999这10000个数,看满足条件的数字有多少个,只有刚好有一个的数满足的情况下才输出。代码如下:#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <iostream>#define MIN( x, y ) (x) < (y) ? (x) : (y)usin
阅读全文
摘要:Tempter of the Bone IITime Limit: 10000/5000 MS (Java/Others)Memory Limit: 98304/32768 K (Java/Others)Total Submission(s): 704Accepted Submission(s): 160Problem DescriptionThe doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it up, the maze was changed and
阅读全文
摘要:连连看Time Limit: 20000/10000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5613Accepted Submission(s): 1455Problem Description“连连看”相信很多人都玩过。没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子。如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子),而且线的转折次数不超过两次,那么这两个棋子就可以在棋盘上消去。不好意思,由于我以前没有玩过连连看,咨询了同学的意见
阅读全文
摘要:Asteroids!Problem DescriptionYou're in space.You want to get home.There are asteroids.You don't want to hit them.InputInput to this problem will consist of a (non-empty) series of up to 100 data sets. Each data set will be formatted according to the following description, and there will be n
阅读全文
摘要:NightmareTime Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2853Accepted Submission(s): 1423Problem DescriptionIgnatius had a nightmare last night. He found himself in a labyrinth with a time bomb on him. The labyrinth has an exit, Ignatius should get
阅读全文
摘要:Knight MovesTime Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2169Accepted Submission(s): 1380Problem DescriptionA friend of you is doing research on the Traveling Knight Problem (TKP) where you are to find the shortest closed tour of knight moves th
阅读全文
摘要:RescueTime Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5895Accepted Submission(s): 2192Problem DescriptionAngel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WALLs,
阅读全文
摘要:诡异的楼梯Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 3323Accepted Submission(s): 746Problem DescriptionHogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向. 比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向.Harry发现对他来说很难找到能使得他最快到达目的地的路线
阅读全文