DFS&BFS
文章平均质量分 59
Falling~
这个作者很懒,什么都没留下…
展开
-
部分和问题
给定n个整数ai,求是否可选出若干个数,使它们的和恰好为k原创 2017-02-24 21:00:10 · 425 阅读 · 0 评论 -
迭代加深搜索IDA*---uva1343 the rotation game
给定一个井字的图形,A-H操作,最少经过几次操作可以将中间8个变成一样的数字 //对于A—H的操作处理得很巧妙 //而且还有reverse操作,可以将mp转换到原来的样子 //启发函数h() #include #include using namespace std; const int maxn = 24; const int转载 2017-11-24 20:56:54 · 249 阅读 · 0 评论 -
判断相同的子树--uva12219 Common Subexpression Elimination
给定一棵树,第一次出现的结点直接输出,并编号。如果有重复的子树,就输出该子树的根的编号。 //非常神奇的递归 #include #include #include #include using namespace std; const int maxn = 5e4 + 5; char line[maxn << 3],*p; int转载 2017-10-04 11:36:26 · 248 阅读 · 0 评论 -
BFS--cf793b Igor and his way to work
从起点走到终点,最多只能转2次弯,求是否能到达终点。 如果用dfs,会因为重复状态过多超时。 所以需要bfs,并且记录是否访问过。 由于有方向和转弯次数的限制,所以需要一起在vis中记录。 #include #include #include using namespace std; const int maxn = 1000 + 5; ch转载 2017-08-25 09:29:42 · 348 阅读 · 0 评论 -
迭代加深搜索--埃及分数
需要用单位分数1/a表示任意分数,并且加数中不能有相同的,加数少的比加数多的好,个数相同时,最小的分数越大越好。 首先,加数的个数不确定,bfs的话,从第一个比a/b小的数1/c开始,可能从所有比它小的数开始加,一层都遍历不完。 dfs,如果直接从1/c开始,找到答案可能很慢,对于加数个数和大小的限制实现起来很慢。 迭代加深搜索:从小到大枚举深度上限maxd,每次执行只考虑深度不超过转载 2017-08-04 09:10:10 · 510 阅读 · 0 评论 -
迭代加深搜索--IDA*--uva11212 Editing a book
给定1 典型的状态空间搜索。 每个序列就是一种状态,通过剪切粘贴互相转移。 1.9!*每次可能的移动数,可能超时。 2.启发函数:统计序列的无效状态(即a[i] + 1 != a[i + 1])的个数h,每次移动最多改变3个无效状态,所以当3 * d + h > 3 * maxd时,可以剪枝。 3.ps:血的教训,状态数组一定要用类或结构体表示。 4.默认已经排好序的不拆开比拆开步数原创 2017-08-04 15:57:30 · 513 阅读 · 0 评论 -
BFS--状态图--uva10603 Fill
3个大小为a,b,c的杯子,一开始只有c装了水,求是否能互相倒水,倒出d,如果可以,求最小倒水量,如果不能,求最接近d的d'。 以杯子水量(x,y,z)为状态,bfs即可。 因为总水量不变,vis[][]即可检查是否遍历过。 #include #include #include #include using namespace s原创 2017-08-01 18:41:03 · 223 阅读 · 0 评论 -
奇偶性剪枝--hdu1010 Tempter of the Bone
给定地图,n * m,S为起点,D为终点,X为墙壁,求是否能刚好在t秒时到达出口。 #include #include #include #include #include using namespace std; const int maxn = 8; char mp[maxn][maxn]; int n,m,t;原创 2017-08-14 20:19:05 · 252 阅读 · 0 评论 -
DFS--uva11853 Paintball
非常有想法的一道题。 1000 * 1000的地图上,n个圆,求是否能从左边界走到右边界,若可以,求最北边的出入口坐标。 #include #include #include #include using namespace std; const int maxn = 1000 + 5; struct circle{ dou原创 2017-07-24 21:21:02 · 241 阅读 · 0 评论 -
贴瓷砖
小明家的一面装饰墙原来是 3*10 的小方格。 现在手头有一批刚好能盖住2个小方格的长方形瓷砖。 瓷砖只有两种颜色:黄色和橙色。 //240ms //ans = 114434 #include #include #include using namespace std; int mp[5][12]; int ans =原创 2017-05-30 20:18:21 · 704 阅读 · 0 评论 -
素数环
//给定n,从1到n,某种排列围成环,使相邻数之和为质数原创 2017-02-24 21:33:16 · 325 阅读 · 0 评论 -
dfs路径输出
1.输出存在任意路径 达到递归出口时,如果符合条件就输出并return true bool dfs(int x,int y,int cnt) { if(cnt == p * q){ //这里输出,或者在main函数中输出 return true; } for (int i = 0; i 8;原创 2018-01-31 16:00:20 · 2132 阅读 · 0 评论