随笔分类 -  搜索

摘要:非常适合A*的一道题。比普通的迷宫问题加一个信息k表示当前穿过的障碍物的数量。#include#include#includeusing namespace std;const int MAX = 21;int m,n,k;int C[MAX][MAX][MAX];int G[MAX][MAX];i... 阅读全文
posted @ 2015-07-10 21:53 瑞宇 阅读(726) 评论(0) 推荐(0)
摘要:根据先序历遍和中序历遍输出后序历遍,并不需要真的建树,直接递归解决#include#includeconst int N = 30;char preOrder[N];char midOrder[N];char S[N];int top;void solve(char *pre,char *mid,i... 阅读全文
posted @ 2015-07-10 21:47 瑞宇 阅读(549) 评论(0) 推荐(0)
摘要:看上去非常像背包的问题,但是体积太大了。线性规划的知识,枚举附近点就行了,优先选性价比高的,宝物有两种体积为S0,价值V0,体积S1,价值V1。枚举分以下几种:1:枚举拿宝物1的数量,然后尽量多拿宝物2;O(N/S0)2:枚举拿宝物2的数量,同上;O(N/S1)3.贪心,尽量选性价比高的令gcd(S... 阅读全文
posted @ 2015-07-10 19:38 瑞宇 阅读(730) 评论(2) 推荐(0)
摘要:题意就是给一张无向图,去掉某些结点,然后连成一条链,问最少去掉几个结点。n很小n=n-1。#includeusing namespace std;const int maxn = 15;int G[maxn][maxn];int n;int c[maxn];bool dfs(int u,int s,... 阅读全文
posted @ 2015-07-10 19:17 瑞宇 阅读(285) 评论(0) 推荐(0)
摘要:骨牌无非两种放法,横着或竖着放,每次检查最r,c最小的没访问过的点即可。如果不能放就回溯。最外面加一层认为已经访问过的位置,方便判断。#includeconst int MAXD = 56;const int MAXB = 29;const int MAXP = 7;bool used[MAXB];... 阅读全文
posted @ 2015-07-10 19:07 瑞宇 阅读(329) 评论(0) 推荐(0)
摘要:剪枝1:在同一个维度上的点具有相同的奇偶性,如果奇数数量只有奇数个那么一定不能返回原点。剪枝2:当前位置怎么也走不回去。3:沿途判断障碍即可。在oj上提交0.347s,最快的0.012s,应该有更好的做法。#includeconst char *bin = "ensw";const int dx[]... 阅读全文
posted @ 2015-07-10 19:02 瑞宇 阅读(372) 评论(2) 推荐(0)
摘要:要输出所有路径,又要字典序,dfs最适合了,用并查集判断1和目的地是否连通即可#includeusing namespace std;const int maxn = 21;int p[maxn],cnt[maxn];void init(int n) { for(int i = 1;i <= ... 阅读全文
posted @ 2015-07-10 18:51 瑞宇 阅读(258) 评论(0) 推荐(0)
摘要:首先说说IDS,就DFS限定一个层数上限maxd,如果在maxd范围内没有找到解,就增加maxd,继续搜索。当访问到当前结点u时,估计还要搜索h(u)层,如果h(u)+当前层数d>maxd的时候就剪枝,这就是IDA*。IDA*属于DFS,当状态空间某一层的结点数无穷大时,BFS失效,只能DFS。相比... 阅读全文
posted @ 2015-07-08 12:17 瑞宇 阅读(1643) 评论(0) 推荐(0)
摘要:这题数据大容易TLE优化:预处理, 可以先枚举出5^3的状态然后判断合不合法,但是由于题目说了有很多墙壁,实际上没有那么多要转移的状态那么可以把底图抽出来,然后3个ghost在上面跑到时候就不必判断了,减少了两次无用的枚举。减少代码的方法:1.结点没有3个时增加冗余点,2.把位置坐标二元组编号成一个... 阅读全文
posted @ 2015-07-07 00:57 瑞宇 阅读(998) 评论(1) 推荐(0)
摘要:题意,给你一颗树的bfs序和dfs序,结点编号小的优先历遍,问你可能的一种树形;输出每个结点的子结点。注意到以下事实:(1)dfs序中一个结点的子树结点一定是连续的。(2)bfs,dfs序中的一个结点u的后续结点一定是u或u的后兄弟结点{v},或u和{v}的后代节点{s}。(3)如果有后兄弟结点,那... 阅读全文
posted @ 2015-07-05 20:27 瑞宇 阅读(2614) 评论(1) 推荐(4)
摘要:一道关乎人生完整的问题。DBFS的优越:避免了结点膨胀太多。假设一个状态结点可以扩展m个子结点,为了简单起见,假设每个结点的扩展都是相互独立的。分析:起始状态结点数为1,每加深一层,结点数An = An-1*m。假如搜索了i层找到终点,那么经过的结点数是O(i^m),如果从两边同时搜索,结点数是O(... 阅读全文
posted @ 2015-07-05 11:27 瑞宇 阅读(330) 评论(0) 推荐(0)
摘要:大体思路是从终点反向做一次BFS得到一个层次图,然后从起点开始依次向更小的层跑,跑的时候选则字典序最小的,由于可能有多个满足条件的点,所以要把这层满足条件的点保存起来,在跑下一层。跑完一层就会得到这层最小的color号。反省:这道题由于有自环和重边的存在,因此满足条件的一个点可能多次被加到队列,这样... 阅读全文
posted @ 2015-06-24 16:54 瑞宇 阅读(1574) 评论(0) 推荐(0)
摘要:第一个A*,纪念下。A*要保证最短路一定要估价函数小于等于实际值,越接近越好估价函数取Manhattan距离除以二。//Rey#include#include#include#includeusing namespace std;const int N = 8;bool C[N][N];struct... 阅读全文
posted @ 2015-06-24 11:35 瑞宇 阅读(280) 评论(0) 推荐(0)
摘要:这题思路就普通的BFS加上一个维度朝向,主要是要注意输入,输出,以及细节的处理#include#include#include#includeusing namespace std;const int MAX = 9+1;const int DIR = 4;const int TURN = 3;bo... 阅读全文
posted @ 2015-06-24 09:40 瑞宇 阅读(563) 评论(0) 推荐(0)