随笔分类 -  算法入门经典第二版第七章 暴力求解法

摘要:用(x,s)表示一个状态,x表示机器人的位置,s表示其他位置有没有物体。用个fa数组和act数组记录和打印路径,转移的时候判断一下是不是机器人在动。#includeusing namespace std;const int maxn = 16;const int maxe = 32;const in... 阅读全文
posted @ 2015-07-31 11:51 陈瑞宇 阅读(239) 评论(0) 推荐(0) 编辑
摘要:暴力,和八皇后很像,用表示i+j和i-j标记主对角线,但是还是要加一些的剪枝的。1.最裸的暴搜6.420s,差点超时2.之前位置放过的就没必要在放了,每次从上一次放的位置开始放0.400s#include#includeconst int maxn = 11;char G[maxn][maxn];i... 阅读全文
posted @ 2015-07-31 10:45 陈瑞宇 阅读(281) 评论(0) 推荐(0) 编辑
摘要:一开始最容易想到间隔最多为n,但是结点还是太多了,需要优化。预处理:预判一下并保存下一个可以放的位置距离之前的距离。这样可以减少很多判断。最优化剪枝:如果当前长度+剩下没放的程序*最短间隔如果大于等于ans,那么对答案没有贡献,可以剪去。优化:占用和不占用两种状态,如果横向来看可以压缩为int,判断... 阅读全文
posted @ 2015-07-14 15:48 陈瑞宇 阅读(549) 评论(0) 推荐(0) 编辑
摘要:多联骨牌的生成办法,维基上只找到固定的骨牌fix,而free的没有找到。于是只好写个set判重的简单枚举了。旋转的操作,可以在坐标轴上画个点,以原点为轴心,逆时针旋转90度,新的点的坐标为(-y,x)。顺时针也差不多。反转类似。对于操作完的骨牌,还要进行标准化,取最小的横纵坐标为参考,求出新的坐标,... 阅读全文
posted @ 2015-07-13 23:53 陈瑞宇 阅读(531) 评论(0) 推荐(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 陈瑞宇 阅读(279) 评论(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 陈瑞宇 阅读(323) 评论(0) 推荐(0) 编辑
摘要:剪枝1:在同一个维度上的点具有相同的奇偶性,如果奇数数量只有奇数个那么一定不能返回原点。剪枝2:当前位置怎么也走不回去。3:沿途判断障碍即可。在oj上提交0.347s,最快的0.012s,应该有更好的做法。#includeconst char *bin = "ensw";const int dx[]... 阅读全文
posted @ 2015-07-10 19:02 陈瑞宇 阅读(318) 评论(1) 推荐(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 陈瑞宇 阅读(247) 评论(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 陈瑞宇 阅读(1633) 评论(0) 推荐(0) 编辑
摘要:看到next_permutation好像也能过╮(╯▽╰)╭这题学习点:1.建图做映射2.通过定序枚举保证字典序最小3.strtok,sscanf,strchr等函数又复习了一遍,尽管程序中没有实际用上4.剪枝,或者回溯#includeusing namespace std;int G[8][8],... 阅读全文
posted @ 2015-07-07 22:31 陈瑞宇 阅读(396) 评论(0) 推荐(0) 编辑
摘要:这题数据大容易TLE优化:预处理, 可以先枚举出5^3的状态然后判断合不合法,但是由于题目说了有很多墙壁,实际上没有那么多要转移的状态那么可以把底图抽出来,然后3个ghost在上面跑到时候就不必判断了,减少了两次无用的枚举。减少代码的方法:1.结点没有3个时增加冗余点,2.把位置坐标二元组编号成一个... 阅读全文
posted @ 2015-07-07 00:57 陈瑞宇 阅读(991) 评论(1) 推荐(0) 编辑
摘要:一道关乎人生完整的问题。DBFS的优越:避免了结点膨胀太多。假设一个状态结点可以扩展m个子结点,为了简单起见,假设每个结点的扩展都是相互独立的。分析:起始状态结点数为1,每加深一层,结点数An = An-1*m。假如搜索了i层找到终点,那么经过的结点数是O(i^m),如果从两边同时搜索,结点数是O(... 阅读全文
posted @ 2015-07-05 11:27 陈瑞宇 阅读(323) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示