
=====各种搜索=====
林伏案
妖蛾子良多的范老爷
展开
-
uva1354
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=41537/*solution: 关键任务是枚举二叉树。 自顶向下构造二叉树,每次枚举左子树用的哪个子集,则右子树就是使用剩下的子集。note: 关于枚举二叉树用到了二进制枚举法。A & B, A | B, A ^ B, 分别对应集合的交,并和对原创 2016-05-15 22:26:13 · 471 阅读 · 0 评论 -
uva140
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19399/*solution: 在这种没有n皇后一样的可行性约束的问题时可以尝试“递归枚举”+“剪枝”note: 剪枝date: 2016/5/7*/#include <iostream>#include <cstdio>#includ原创 2016-05-07 20:37:37 · 759 阅读 · 0 评论 -
poj3009(dfs/bfs)
题目描述:点击打开链接/*translation: 题目给出冰壶初始位置,以及目标位置。要求以最短的步数将冰壶移动到目标位置。 注意冰壶每往一个方向走上一步,就将一直往这个方向移动知道碰上障碍。碰到障碍 时,障碍本身也被击碎。求出最短的步数是多少??solution: dfs,回溯,剪枝 要求最短路径的第一反映是用bfs,但这道题用dfs + 剪枝也能求出来。因为是求最优 解原创 2016-08-28 10:28:06 · 616 阅读 · 0 评论 -
poj1321(回溯板子)
该题存为板子描述:点击打开链接/*solution: 简单回溯note; 注意一定要考虑摆放时一定要按照行递增或者列递增顺序进行摆放。否则可能出现解重复的情况。date: 2016.8.28*/#include #include #include using namespace std;bool col_tag[10];int n, k, ans;cha原创 2016-08-28 11:35:16 · 437 阅读 · 0 评论 -
poj2488(回溯板子题)
存着做模板#include #include #include using namespace std;int dir[8][2] = { {-1, -2}, {1, -2}, {-2, -1}, {2, -1}, {-2, 1}, {2, 1}, {-1, 2}, {1, 2} };int p, q, b[27][27];struct Map { int y, x;}a原创 2016-08-23 19:39:08 · 360 阅读 · 0 评论 -
poj3083(dfs/bfs混合)
链接:http://acm.hust.edu.cn/vjudge/problem/15200/*translation: 先沿着左边的墙从 S 一直走,求到达 E 的步数。 再沿着右边的墙从 S 一直走,求到达 E 的步数。 最后求最短路。 solution: 最短路好求。重点是前两步! 很容易想到前两步用简单的dfs就可以求出。但是关键是要“沿着墙壁走”! 观察可以发现规律原创 2016-08-24 17:27:04 · 571 阅读 · 0 评论 -
uva12169(同余模运算+暴搜)
/*translation: 根据公式x[i] = (a*x[i-1] + b) % 10001 可以生成一串数列。现在给出x[1],x[3],x[5]...x[2*T-1], 要求其下标(从1开始)为偶数的部分。solution: 其实跟数论没太大关系,纯暴力。date: 2016.8.24*/#include <iostream>#include <cst原创 2016-08-24 20:55:24 · 428 阅读 · 0 评论 -
poj2718(子集生成)
/*translation: 给出一组数,用这一组数字的两个不相交的子集组成两个数。求两个数差的绝对值的最小值。solution: 生成所有可能的子集 可以用库函数,也可以用bitset写。这里直接用next_permutation生成所有的可能排列 再从中间切割,用前后两个数相减的值依次更新ans值即可。note: 1:本来想用dfs生成所有的可能解,但还是库函数好用。date原创 2016-10-23 16:30:34 · 315 阅读 · 0 评论 -
poj3187(杨辉三角+dfs生成可能解)
/*translation: 给出一个杨辉三角的最顶端的数,求最低端的数。有多解时直接输出字典需最小的。solution: 直接递归生成所有可能解即可note: 1:一开始WA,原因是直接init(maxn),后来改成init(n)就过了,不知道为啥?date: 2016.10.21*/#include #include #include using namespace原创 2016-10-23 16:35:02 · 442 阅读 · 0 评论 -
poj3126(埃氏筛法,双向bfs)
/*translation: 给出一个4位素数,要将其转化为另外一个指定的素数。每次只能改变其中一位数字,且期间所有的数字全为素数。 问最少要经过多少步骤?solution: 埃氏筛法,双向bfs 打个表,再广搜一下即可,水题。为了提高下难度,所以改用双向广搜。0ms过!note:date: 2016.10.28*/#include #include #include原创 2016-10-28 11:43:55 · 584 阅读 · 0 评论 -
poj2785(折半枚举)
/*translation: 从4个数列里面选择四个数,使其和为0.共有多少种方式?solution: 折半枚举即可note:date: 2016.11.10*/#include #include #include #include #include using namespace std;const int maxn = 4000 + 5;typedef lo原创 2016-11-13 22:12:17 · 363 阅读 · 0 评论 -
poj2549(折半枚举)
/*translation: 给出一列数列,求满足等式a+b+c=d的最大d是多少?其中abcd都是数列中不同的数字。solution: 这类问题多半用折半枚举法就可以解决了note:date: 2016.11.11*/#include #include #include #include #include using namespace std;const int原创 2016-11-13 22:15:33 · 358 阅读 · 0 评论 -
uva129
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19665/*solution: 直接使用dfs搜索穷举note: 注意每当dfs一层时要判断是否为困难串时,只需判断当前串的字符串即可,原理和8皇后一样。 因为前面都已经在上面几层的dfs时判断完了。date: 2016/5/7*/原创 2016-05-07 20:20:57 · 934 阅读 · 0 评论 -
二进制枚举法枚举子集
A&B,A|B和A^B分别对应集合的交,并和对称差。空集为0,全集all_bits = (1 << n) - 1A的补集为all_bits ^ A 下面是有关代码:#include <iostream>#include <cstdio>using namespace std;int main(){ int n; cin >> n; for(int i = 0; i原创 2016-05-07 19:55:57 · 421 阅读 · 0 评论 -
八数码问题
问题描述: 有3行3列正方形,里面填充有8个数字,给定初始状态和最终状态。求最少要几步才能到最终状态? 样例输入: 2 6 4 1 3 7 0 5 8 8 1 5 7 3 6 4 0 2 样例输出: 31/* 8数码问题,给出3*3的正方形,输入初始状态以及目标状态,求出从初始状态到目标状态所需的最小步数solution: 可以把8数码问题归结为图上的最短路进问题,图的结原创 2016-05-15 22:30:41 · 538 阅读 · 0 评论 -
uva10603
题目描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19527/*solution: 还是把状态看成结点,然后以隐式图的方法去扩展结点,其过程跟dijkstra算法有点类似。note: 隐式图date: 2016/5/4*/#include <iostream>#include <cstdi原创 2016-05-15 22:34:02 · 388 阅读 · 0 评论 -
埃及分数问题
问题描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34882/*solution: 采用迭代加深搜索,从小到大枚举深度上限maxd,每次执行之考虑深度不超过maxd的结点。note: 如果在加上最优性剪枝,就成了IDA*算法date: 2016/5/10*/#include <iostrea原创 2016-05-15 22:41:46 · 553 阅读 · 0 评论 -
uva11212
题目描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=23956/*solution: 采用IDA*算法note: IDA*算法就是从小到大枚举深度上限,每次执行只考虑最大深度之内的结点,再设计一个乐观估价函数,用来剪枝。 其实就是 “迭代加深搜索” + "乐观函数剪枝"date: 2016原创 2016-05-15 22:43:38 · 820 阅读 · 0 评论 -
uva12325
题目描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=24875#include <iostream>#include <cstdio>using namespace std;typedef long long ll;ll s1, v1, s2, v2, n;long long value;int main(){原创 2016-05-15 22:45:27 · 474 阅读 · 0 评论 -
uva1343
题目描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36627/*solution: IDA*公认经典题,典型的状态空间搜索,但如果套用8数码框架会超时,所以用IDA×算法note: 注意旋转操作用到数组化不连续为连续,方便了枚举操作(line, center数组)date:2016/5/10*/#i原创 2016-05-15 22:49:57 · 406 阅读 · 0 评论 -
uva1374
题目描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=41552/*solution: 迭代搜索+最优性剪枝,状态搜索。date:2016/5/7*/#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>usin原创 2016-05-15 22:58:49 · 497 阅读 · 0 评论 -
UVA1602
题目描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51164/*solution: 本题利用回溯法解决。本题实际上是要搜索n连通块不同形态的个数(平移,翻转,旋转后相同的算作一种形态),因此能够有效的判断n连通块是否重复是关键。 那么如何判断是否重复呢?我们一步步的分析。由于可能要涉及对一个对象的旋转,平原创 2016-05-15 23:00:27 · 985 阅读 · 1 评论 -
uva1603
题目描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51165/*solution: 可以用迭代加深算法作为框架。搜索对象主要有两种:一是正方形,而是火柴。 个人采取前者。date:2016/5/15*/#include <iostream>#include <cstdio>#include <c原创 2016-05-15 23:03:33 · 846 阅读 · 0 评论 -
uva1601(双向BFS经典题)
题目描述:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51163 首先用单向BFS解决,代码如下。最后在单向基础上改进成双向单向:/*solution: 还是隐式图搜索问题,类似dijkstra,用bfs解决,这个是单向搜索,弊端是有时候随着搜索 的深入,可扩展的结点会越来越多,造成效率变慢,用双向bfs原创 2016-05-15 23:13:35 · 5470 阅读 · 5 评论 -
枚举排列
/*利用STL中的next_permutation枚举排列*/#include <iostream>#include <algorithm>using namespace std;int main(){ int n, s[10]; int cnt = 0; //计数共有多少种排列组合 cin >> n; for(int i = 0; i < n; i++原创 2016-05-07 19:47:07 · 285 阅读 · 0 评论 -
poj3977(折半枚举,多坑)
/*translation: 给出一列数列,找出其中的非空连续子序列,使得其和的绝对值最小。如果有相同的和的情况下输出元素个数最少的那个solution: 折半枚举即可note: #: 思路很简单,分成两半,折半枚举即可,但是代码中有很多坑。首先必须对前后两部分只选一个的情况单独考虑。然后如果 ans_sum的预设值为INF的话还是会WA,所以最好设置为随便一个集合的和就行。da原创 2016-11-13 22:23:05 · 570 阅读 · 0 评论