![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ACM_搜索
文章平均质量分 69
xcszbdnl
这个作者很懒,什么都没留下…
展开
-
uva 639
一道类似于8皇后的回溯题。一开始老想不通怎么回溯,准备直接暴力的,估计都会TLE。也没写。参考了下别人代码,八皇后为逐行填写,此问题因为有墙,所以同一行可以放置,应该从左到右依次放子题目:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=580AC原创 2012-08-07 21:23:11 · 904 阅读 · 0 评论 -
POJ3009
冰块的滑行。看到此题目求最短路径,想到了广搜算法,开一个结构体记录每一个球所在的位置和墙的状态。采用广搜+Hash判重。试着写了一下。交上去,结果TLE了。本来也是看POJ上题目分类是深搜的,但给我直观印象求最短路还是采用BFS+Hash的方式。晒一下我的代码和思路:模拟每一次移动,上下左右#include#includeusing namespace std;const i原创 2012-08-25 20:41:23 · 1222 阅读 · 0 评论 -
POJ1321
一个n*n的棋盘里面放k个棋子。有点类似于8皇后问题。只不过是有些地方不能放棋子。并且放棋子数只需要k个就行了。想到了类似于8皇后问题就采用深搜的方式。由于只要放k个棋子,且有些行不能放棋子。所以可以先预处理一下,看哪些行需要放棋子。处理当前行的时候有两种状态,一是在当前航放棋子,二是不放棋子。放棋子就类似于8皇后判断是否有相同列,不放棋子则直接深搜下一行。再加一些剪枝。当前放了c原创 2012-08-25 22:33:27 · 1508 阅读 · 0 评论 -
POJ2251
坑爹的是竟然把这题目分类在了深搜里面。昨天做到POJ3009,也是把题目放在深搜里面。然后求最短路,自己就用BFS做,结果TLE了。就采用DFS做了。今天这题又放在DFS里面,以为用BFS会TLE。结果用DFS搜索所有路径找最短路才是TLE的。晕啊,看来还是不要轻易的相信题目的分类。先贴一下TLE的DFS代码,直接以步数深搜和当前坐标点下去就OK了。#include#includ原创 2012-08-26 16:40:27 · 1651 阅读 · 0 评论 -
POJ2531
将所有节点分为两个子集,A,B。求A的各个元素与B的各个元素之间的和。深搜就行,看POJ分类说要剪枝,想了半天不知道怎么去剪,随便写了下,竟然被我一次水过了。实训后第一次写代码果然效率高啊。并且代码风格果断改善了很多。。呵呵。。#includeconst int MAX_NODES = 20;int node_num = 0;int max_traffic, choose原创 2012-09-21 21:03:58 · 1974 阅读 · 0 评论 -
POJ1416
切纸片问题。因为最高只有6位数,直接深搜。复杂度为O(2^6)预先处理一下,将纸片上各个位置的数取出来,如12346用一个数组保存下来就是1 、2、 3、 4、 6。对于每个顿号处有切和不切两种选法,再用一个数组保存每个位置到底是切还是不切。按照此思路深搜下去就可以得到最后的答案了。#include #include using namespace std;const int M原创 2012-09-22 17:04:33 · 757 阅读 · 0 评论 -
POJ2676
填数独。直接暴力深搜,哪个点要填就不断的填下去,每填一个就判断该格填的数满不满足要求,满足要求了就搜下去,搜到最深处直接输出就OK了。不过时间复杂度有点高。没什么剪枝和优化。#include #include using namespace std;const int MAX = 10;int su_do_ku[MAX][MAX], to_fill[MAX*MAX];int原创 2012-09-22 16:59:09 · 1150 阅读 · 0 评论 -
POJ1129
为每个节点选一个频道,相邻的节点的频道不能相同。采用深搜,为每个节点选一个编号,从1开始选,因为是从1开始选的,所以选到最后能匹配的一定是最小的频道数。选一个节点的时候判断一下就OK了。搜索的题目基本上在POJ上AC完了,UVA上的也A完了。现在对搜索的题目感觉挺有自信的。。呵呵AC代码:#include #include using namespace std;cons原创 2012-09-22 19:15:28 · 1933 阅读 · 1 评论 -
UVa10400
表示式形式,采用深搜。和24点类似。不过比24点简单一点,采用一个状态判重数组注意回溯的时候,因为是对每一次cur进行数字运算。所以当vis[cur][sum] = 1时回溯回来的时候不要改其被访问的状态。因为不管怎样只要sum在cur处被运算到了都是一样的,所以不要改回来。一开始在dfs(cur+1)后加了句vis[cur][sum] = 0;结束TLE了。后面看的解体报原创 2012-10-16 23:32:28 · 392 阅读 · 0 评论 -
codeforces_350b
求到宾馆的最长路。开始想法是添加超级起点和终点,起点向所有山连接一条权为0的边,所有宾馆向终点连接一条权为1的边。然后只有出度为1的点才可以对后面进行更新(超级起点不算),做一遍spfa最长路,然后输出路径。不知道为什么会TLE = =然后重新想可能枚举所有起点,然后求当前起点的最长路。发现好麻烦。因为一个点有多条出的路径。dfs时间复杂度也太高。没有想到反过来做。。枚举所有终原创 2013-10-02 15:37:38 · 1282 阅读 · 0 评论 -
UVa321
对每一个状态进行遍历,用door来表示当前所在的房间,state[10]表示各个房间的开关情况,每次进行一步移动总状态为10*2^10.用hash来判重。用一个状态数组flag来记录每一次是进行的什么操作。最终状态为所在房间为r,只有r房的灯开着的。每次只考虑一步就行了,从小到大的开。一开始考虑复杂了,考虑到可能开一盏灯,然后还要从控制中选一盏,或者两盏灯等等。其实每次只要一步,这些开多盏原创 2012-08-24 22:25:25 · 599 阅读 · 0 评论 -
UVa10422和UVa10085
两个题目都是类似的。八数码遍历的基本问题。自己早先前看过八数码问题,写了一遍,不过。后面对着解题报告,又按自己的思路写了一遍,还是不过。老是runtime error。不知道错在哪里,调试废了我一天。哪位有心研究下能指点出来感激不尽啊。打算放弃了。因为已经了解其中的算法了。就是....神啊,求指导。呜呜。就是模拟跳马和移动格子,然后进行广搜,用hash判重。关键是hash判重。原创 2012-08-23 23:55:20 · 919 阅读 · 1 评论 -
UVa539
题目:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=480UVa539,求无向图的最长路径采用逐个点深搜的方式,找到一条路径,维护最大值#include#include#define MAX 26int map[MAX][MAX],v原创 2012-08-09 18:24:19 · 593 阅读 · 0 评论 -
UVa391
简单的深搜题。果然题目做得越多越有感觉。。只要把每一个账单是否取搜一遍就行。取的时候看下满足不满足条件。#include#include#define MAX 23struct node{ int start,end; int people;}train[MAX];int station[8];int vis[MAX];int passengers,maxvalue,原创 2012-08-18 14:11:13 · 491 阅读 · 0 评论 -
UVa10344
由5个数算23点的问题。另外还引申了一个4个数算24点的加括号的问题。到底有多少种。有想清楚的同学可以交流下...自己才疏学浅。只考虑一种加括号的形式,一开始没弄懂这句话什么意思。写了一个所有加括号的情况。相当于暴搜,把所有情况,所有加括号的形式写出来。#includeconst int goal=23;int arrays[5];using namespace std;b原创 2012-08-18 23:31:13 · 636 阅读 · 0 评论 -
UVa208
越做题目越上瘾。最近在做搜索和DP,这个题目看就是直接深搜+回溯就行了。写完直接TLE了,因为没有剪枝,总共有21个节点,还是太大了,一般都在8个节点左右的话貌似不剪枝都能过。原来先要预处理一下,只考虑和目标站在一个连通块的点就行了。也就是求一个点的连通块。写完了AC0.004s。果然剪枝不剪枝的终于见识到巨大威力了。#include#include#define MAX原创 2012-08-19 16:42:05 · 1298 阅读 · 1 评论 -
UVa193
用二色染图,黑色不能相邻,求最多染多少个黑色的点。一开始没考虑剪枝,也一看100个点估计一个一个点找就直接TLE了,不知道怎么去优化,后来google下,别人都说可以直接暴搜,一个点一个点的染。写了一下,一个点一个点的染,一开始还是考虑相邻点染的,结果写完后也没什么剪枝就直接TLE了,参考下别人代码,发现所有点都要染,就可以从点1直接染到点n.这样就可以剪枝,因为如果还剩m个点没染,但原创 2012-08-19 22:43:50 · 686 阅读 · 1 评论 -
UVa140
计算带宽,就是进行输入处理有一点的麻烦。枚举所有的排列,算出最大带宽最小的排列。看算法竞赛入门书上说有剪枝的方法。不知道怎么去写,哪位高人知道的可以指点一下。#include#include#define Arsize 28int maps[Arsize][Arsize];int arrays[Arsize];int order[10];int a[10];int ans原创 2012-08-20 17:55:31 · 793 阅读 · 0 评论 -
UVa216
纯粹枚举枚举所有排列,记录最小的距离。不过貌似有单源最短路径算法。#include#include#define Maxnode 9#define INF 100000int ans[Maxnode];int a[Maxnode];double distance[Maxnode],ansdistance[Maxnode];int nodes;double maxdist原创 2012-08-20 17:53:06 · 509 阅读 · 0 评论 -
ZOJ1004
压入栈的操作。递归的终止情况为push=pop=lenth坑爹的是每一个i和o后面都有空格,最后一个也有。交的时候老Presentation error...找了半天,才知道。能压入的就不断的压入,不能压了就开始弹。AC代码:#include#include#define Max 100char goal_str[Max];char source_str[Max];c原创 2012-08-20 21:43:35 · 3153 阅读 · 4 评论 -
UVa10603
隐式图的遍历采用广度优先搜索的算法,从当前节点front扩展出所有可能的节点。扩展就是从一个杯子的水往另外一个杯子里面倒。首先需要判断一下可以倒多少水,从第i个杯子往第j个杯子里面倒,如果第i个杯子有L升,第j个杯子有K升,则第j个杯子还能容纳cap[j]-K升,cap为容量。倒完后用vis数组判重。只需要开两个状态即可,即第一个和第二个杯子的倒水量,重了就不扩展,不重的话就入队进行扩原创 2012-08-22 21:00:11 · 1363 阅读 · 0 评论 -
usaco_1.4.3
做的时候只知道把表打出来,不知道怎么去找等差数列。做法直接枚举公差和首项即可。AC代码:/*ID: 123PROG: ariprogLANG: C++*/#include #include const int MAX_NUMBER = 250 * 250 * 2 + 3;bool vis[MAX_NUMBER];int n, m;void ini原创 2013-09-28 20:38:19 · 616 阅读 · 0 评论