
ACM_搜索
文章平均质量分 65
羁绊残阳
四川大学计算机科学与技术
展开
-
soj 4396 bfs
背景:周赛h题。学习:1.用queue写的bfs,主要注意的是,每一个生成后的子数据都要被标记为不能走了,否则将会越产生越多情况而超内存。2.调试出现异常一定是代码问题,不要盲目以为编译器问题,认真一句一句的读代码查错为好。#include#include#include#includeusing namespace std;struct pal{ int x; int原创 2014-12-23 16:19:38 · 741 阅读 · 0 评论 -
hdu 1372 bfs最少棋子步数
背景:还是熟悉bfs,还是调试之后1Y,看来非要写到滚瓜烂熟了!!!。学习:1.这里队列里每个元素是除了坐标还有步数的结构体。我的代码:#include#include#include#includeusing namespace std;int diagram[8][8];struct place{int x,y,count;}temp1,temp2,temp3;int原创 2015-03-12 23:00:30 · 760 阅读 · 0 评论 -
poj 2386 bfs
背景:主要是熟悉bfs写法,虽然1Y,但是中间调试了几次,还是有小失误。看了@liujc的写法,dfs也可,但是感觉bfs效率高些?我的代码:#include#include#include#includeusing namespace std;char diagram[109][109];struct place{int x,y;}temp1,temp2;int dir[8][原创 2015-03-12 21:55:17 · 663 阅读 · 0 评论 -
hdu 1728 bfs 变形最小转弯数
//hdu 1728背景:wa了29次,最后还是借助别人的想法。第一种想法:把visit数组的每一个位置储存为到达当前坐标点所需要的最小转弯数,最后对于每个走过的点都是到达该点的最小转弯数。这样的最小转弯数点又递推下一个最小转弯数点.....这样层层递推直到终点。第二种方法:在普通情况下的bfs是每一步都走距离为1,找出所有的下一步放入队列,然后这样层层递推,而这个题中我们bfs每原创 2015-03-22 10:57:57 · 997 阅读 · 0 评论 -
poj 3414 bfs+模拟
背景:1_WA:尽然忘了输出序列长度!!!我是怎么看的样例输出!!!改了之后ac!!这个题是很考代码能力的。我的思路:就是6个出口的bfs,初始时候的两个容器的容量都是0,然后分别执行6个操作衍生出下一层(这里注意剪枝,比如第一个瓶子容量已经为0就没有必要再drop(1)了。这里很巧妙的是用了一个vis[iv][jv]数组来做访问标记,如果没有这个访问标记,后代呈现6的指数增长想必爆队列是必然原创 2015-03-24 13:21:25 · 548 阅读 · 0 评论 -
poj 3083 dfs+bfs
背景:竟然G++,wa了一发,同样的代码,改为C++就过。。。后来看了discuss里面人说bfs最后虽然不会用到有return 的情况,也要加上,这个warning警告了的,没想到加上就ac了。。。思路:bfs求最短路,然后就是对一直向左和一直向右进行dfs,方法是:记录上一次来的方向,然后根据上一次来的方向确定当前方向怎样才是向左,怎样才是向右,向左的话是顺时针转动,向右的话是逆时针转动。原创 2015-04-03 13:12:23 · 596 阅读 · 0 评论 -
hdu 2531 dfs 无向图分区
题意:给了一个无向图的邻接矩阵,求这个无向图分为两区域,不同区域间节点距离最大值。方法:用dfs枚举每个点在哪个区域即可。这里开始我用的是每次枚举到树的叶子节点后,在计算距离,这样每次计算都是n2n^2,改为每变化一次就改变距离之后时间缩小了5倍,因为这样每达到一个叶子节点均摊的计算量都不足n。这里第二种代码,中dfs函数的参数列表多了一个sum来维护距离枚举到叶子节点再计算的代码: (原创 2015-05-10 20:13:30 · 514 阅读 · 0 评论 -
poj 1979 dfs
水过,注意边界不能超出。#include <iostream>using namespace std;int n, m, sx, sy, dir[4][2] = {0, -1, 0, 1, 1, 0, -1, 0}, count;char diagram[23][23];void get_diagram(void) { for (int i = 0; i < n; i++) {原创 2015-07-22 21:56:10 · 641 阅读 · 0 评论 -
hdu4090 双重dfs模拟 + 启发式搜索
题意:消消乐,每次必须消除数量大于等于3个,而且得分是消除个数的平方,每次消除之后局面往左下角收拢. 分析: - 首先很容易想到对每个当前局面枚举每种颜色来dfs消除,注意这里对每一个已经消除过度页面要vis记录 要不然超时,比赛的时候记录了,但是初始化vis的地方写错了,导致TLE,交换了顺序就AC….看来代码逻辑还是 不够清晰,不能完整表达正确的想法,而且出现了错误不能很快正确的原创 2016-05-05 09:46:22 · 495 阅读 · 0 评论 -
SCU2016-04 B题 枚举+ bfs最短路
Analyse: 用bfs处理相互之间的最短路,然后dfs枚举这个路径的所有情况。 复杂度:O(n∗m∗k!)O(n*m*k!) Get: 数据小的,尽管暴力就是了。/**********************jibancanyang************************** *Author* :jibancanyang *Created Time* : 一原创 2016-07-11 11:51:56 · 353 阅读 · 0 评论 -
SCU2016-03 P题 二分+DLX可重复覆盖
Analyse: 显然二分半径来解决该问题。 然后建立一个m*n列的矩阵,判断是否可以选择不多于k行,让n列都至少被覆盖一次。 DLX可重复覆盖模板套上即可。 Get: DLX可以解决精确覆盖,可重复覆盖等问题,而且可以限制选的行数。在限制的时候可以用A*算来进一步剪枝。/**********************jibancanyang*************************原创 2016-07-08 12:18:08 · 285 阅读 · 0 评论 -
poj 3126 bfs
背景:ac的比较顺利,看来写完代码之后再扫视一下全代码是个不错的方法。思路:就是对千位百位十位个位都进行扩展的广度优先搜索。这里还提供一种bfs思路:把1000到9999的所有素数都放到list里,每次对于一个数,在list找出所有和它只有一个数字不相同的数字加入队列中,直到找到目标数组。我的代码#include#include#include#include#include原创 2015-03-21 14:45:19 · 720 阅读 · 0 评论 -
hdu 1458 bfs模板化写法
背景:1.编译错误:next和系统命名冲突。2.wa:起点大于楼层的情况未考虑。wawawa了一下午,我把走过就把内容设为-1的方法,改为由flag数组标记是否访问就对了。然后实验,把访问过的标记为-100000,也ac!!!说明题目中ki存在小于0的情况!!!!!存在-1!!!!!与题意不符!!wa了一下午。。。我的代码:#include#include#include#include原创 2015-03-10 15:44:54 · 791 阅读 · 0 评论 -
hdu 1312简单bfs
背景:周赛c题,写好代码40分钟,然后一直调不通,调到还剩3分钟比赛结束的时候突然返现step写法错误,快速该,最后102s提交ac!!!!太刺激了。学习:1.开始一直调试了好久就是字符串的读入有问题,没有在意在用getchar读取字符串时对‘\n'的处理。2.思想依然没有十分严谨的把一个问题过程全部理清楚就去写代码,最后又花很久时间去调试,这是很得不偿失的。比如这里ha的归0开始就没原创 2014-12-08 19:43:26 · 927 阅读 · 0 评论 -
hdu 1241
背景:dfs递归实现。思路:对于每一个@都把和组成一个片区相连的所有@变成*,并计数一次。#include#include#includeusing namespace std;char map[105][105];int direction[8][2]={1,0,1,1,1,-1,0,1,0,-1,-1,0,-1,1,-1,-1};void dfs(int i,int原创 2015-02-27 11:25:35 · 748 阅读 · 0 评论 -
hdu 1175 dfs
背景:数次超时,数次wa,dfs还是存在代码不规范的情况,什么时候回溯没有考虑清楚。后来看了模板化的搜索写法,发现我一直没有用过visit[M][M]标记访问过的点,而是直接在原图上标记,这样是节约内存但是,容易出错!思路:这个转向题最大的特点是,创建了一个结构体,即有转向数count,也有上次走来的方向up,一旦up和这次的方向数不一样,count就加一(我的代码少考虑了,起点和终点在同一点原创 2015-03-15 10:18:13 · 531 阅读 · 0 评论 -
poj 2215 bfs求最短路
背景:最短路典型bfs,竟然ML! 后来发现时vis数组标记的时机不对,我开始是把每一个位置把它从队列头调用的时候才标记为访问过!但这种依然是有重复的内容出现在队列中,应该在对每一个位置入队的时候就标记为访问过。我的代码:#include#include#include#include#include#include#include#include#include#defin原创 2015-03-26 00:06:43 · 672 阅读 · 0 评论 -
poj 2488 dfs
背景:就是简单的遍历全图搜索,但要注意两点: 1.一开始以为起点不同会有不同结果,所以就枚举了起点,但实际上只要能遍历全图就能把A1作为起点,因为遍历全图就是每个点都要走到,那么A1也要走到,既然可以走到A点,那么也可以从A点走到其它点。 2.题目中的字典序输出,不看看很能想到题意是先满足列,然后满足行,这样写出满足条件的方向数组即可。//poj 2488原创 2015-03-19 20:08:11 · 517 阅读 · 0 评论 -
poj 1321 dfs
背景:1AC,自己YY的方法,很好。思路:这个题看到感觉是八皇后的变种。但是有两点不同:1.棋盘不是规则的形状,这个简单,就相当于有些地方不能放。2.棋子数k 我的代码:#include#include#include#include#include#include#include#include#include#define M 10#define INF 0x3ff原创 2015-03-26 12:41:54 · 444 阅读 · 0 评论 -
poj 3278
背景:开始wa了几次,是因为剪枝的不合理。然后去掉其中几个错误剪枝ac。就是三个方向的bfs,一定要用标记数组,要不然数据会呈现3的指数级别增长会爆队列的。这里标记数组起始可以用bool visit[M]。学习:1.如果队列不用stl的话,可以用数组实现,只是在数组中间操作:int queue[2*M];int *front=queue+M,*back=queue+M+1; //定义队原创 2015-03-20 13:29:27 · 703 阅读 · 0 评论 -
poj 3009 dfs
背景:dfs,再加点模拟,各种代码疏漏错误wa了三次!!也有变量名使用不规则照成的。比如临时变量我我就应该用temp,buffer,key,三个变量名来表示。思路:每一个点四个方向的dfs,到达终点就判断最少步数。bfs的思路:这个是经典的最短路问题,但是缺点是,地图会改变而bfs没办法像dfs那样容易回溯,方法就是把地图直接放在每一个坐标上,也就是定义一个结构体:原创 2015-03-27 20:33:49 · 489 阅读 · 0 评论 -
poj 1753 dfs递归组合数
背景:一共16个棋子,每个棋子只有翻或者不翻两种情况,共有2^16种可以直接枚举。枚举的方法是组合数:C(16,k) (k:1 to 16) 就是翻1个,2个,3个.....16个的情况。其中用到了递归求组合数的思想。这种求组合数的方法和平常的思维不一样,比如求:1,2,3,4 的组合数,平常是先求一个数的:1,2,3,4四种情况,再求两个数的:12,13,14,23,24,34六种情况,再求三个原创 2015-03-20 13:35:59 · 568 阅读 · 0 评论 -
hdu 1010 dfs,奇偶剪枝
背景:这个要好生写。#include#include#include#includeusing namespace std;char map[10][10];int n,m,ans,count,ok,direction[4][2]={1,0,-1,0,0,1,0,-1};struct palce{int x,y;}start,end1;void dps(int x,int y){原创 2015-03-09 23:26:05 · 508 阅读 · 0 评论 -
SCU2016-03 O题二分 + DLX可重复覆盖
Analyse: 二分距离加DLX可重复覆盖。 注意这里的距离爆int. Get: 在头文件/**********************jibancanyang************************** *Author* :jibancanyang *Created Time* : 五 7/ 8 14:12:54 2016**Problem**:**Cod原创 2016-07-08 15:05:44 · 325 阅读 · 0 评论