08 2012 档案
摘要:用vertor动态数组来做的,模拟链表。#include<iostream>#include<vector>#include<string>#include<queue>using namespace std;const int Max = 27;bool used[Max];int flag;vector<int>V[26];void DFS(int n){if(n=='m'-'a') //找到目标{flag = 1;return ;}else{while(!V[n].empty()){int k =
阅读全文
摘要:题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1045程序分析: 题目是说在一个特殊的地图里摆设碉堡,限制条件可能跟N皇后又点相似,但是这里有墙,中间隔有墙的话还是不会互相干扰的。只是行列方向会冲突,斜角线不会冲突,。所以我们只有判断所在的行列不会存在冲突的碉堡就行。注意中间可以隔有墙。记住每一次到达最后一个点时的可放碉堡数,比现在保存最大的就替换为最大值。解决方法: 深搜回溯,找出每一种方法的最大放置碉堡数,编写一个判断能否放置碉堡的函数,细节看代码。 View Code 1 #include<iostream> 2 #inclu
阅读全文
摘要:题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1175程序分析: 题意大概就是说了一些连连看的游戏规则,就是在有限次转弯内能到达终点而且两个点是同样的类型的点就可以把他们消去。注意的是不可以绕过外面而相连,而且两个点不可以存在是0类型的点,也不可以是始点跟终点为相同的一个点。给你整张图,还有一些点,问你这些点能否消去。解决方法: 要求最小的弯道相连道消去,那么可以考虑用广搜了,只要计算好路途中经过的弯道数就可以了。可以以弯道数不大于2为剪枝条件。入队前标记。不过在判断能否入队列前应该先把下一步要到达的点的弯道数和方向赋值好。就是先赋值再...
阅读全文
摘要:题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1242程序分析: 题意是说一个公主被困在监狱里了,她的一些朋友想要去救她,(注意是一些,也就是会有好几个朋友),在途中他们可能会遇到士兵守卫(守卫驻守在一个格子里),但是她的朋友很强大,可以保证把守卫都干掉,不过这得耗一个单位的时间,当然经过守卫这个格子同样也需要一个单位的时间(经过没有守卫的格子是需要一个单位的时间的);那么监狱并不是敞开的,总会有那么一些墙堵住,好,这些墙是过不去的,最后就是让你计算最快要多少个单位的时间可以跟公主碰面(默认碰面即是救到公主了);解决方法: 广搜可以找到到达..
阅读全文
摘要:题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1180折腾了一下午,最后用优先队列做,这个应该也是UCS搜索吧。灵敏搜索!View Code 1 #include<iostream> 2 #include<queue> 3 #include <algorithm> 4 #include<string> 5 using namespace std; 6 7 const int Max = 25; 8 char s[Max][Max]; 9 int ax, ay, ex, ey, mx, my; 10
阅读全文
摘要:题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1728程序分析: 题目是要让你计算在一个迷宫里从一个点到另一个点要转的弯数是否小于给定的弯数限定。也就是判断能否在有限弯数内从一个点到达另一点。只能从四个方向走。输入数据有点与以往不同,注意输入的行跟列还有两个点的做坐标。解决方法: 迷宫之类的题大多数都能使用BFS或者DFS吧,不过这道题比较多陷阱和技巧,首先,每一种走法经过的弯可能是不同的,虽然都是经过同一个点,但是到达这个点时经过的弯路可能就不同了。应该有点DP的味道吧,BFS+DP可以算出来。这需要开多一个二维数组来保存这个点最小的转弯..
阅读全文
摘要:题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1142程序分析: 题目意思是说一个人要从上班的地方回到家里,途中会经过一些地方,按下面规则问他回家会有几种路线:题目已经定义好1为上班地方2为家,每个地点之间的距离都已经知道,哪么如果从A到B的一条路,可以走的条件是B到2(家)的路程必须小于从A到2(家)的路程,其实就是A到家的最短路径必须大于B到家的最短路径。默认一定可以走到家,也就是一定会有一种路线。最后是让你计算有几种路线。解决方法: 因为有一个固定的起点,哪么就可以用dijkstra算法计算出每一个地点到家的最短路径,然后用DFS回溯..
阅读全文
摘要:八皇后问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。八皇后问题不是只用于这个有点无聊的数学问题上,不然就没什么研究意义了。在景观设计,道路布局,城市规划等方面有应用价值。比如布置景观时,要让N个景观互相不遮挡视线。方案一 暴力法最容易实现的,8层循环嵌套当然OK,但它的复杂度惊人,O(nn),n为行列数为了减少循环次数,针对该问题,最外层循环从第一列开始,向内层依次加1,最内层循环就从第八列开始了。方案二 回溯法八皇后问题是回溯法经典的例子回溯法基本的思想是采用递归,并且分
阅读全文
摘要:所谓Informed Search,就是带有智慧决策的搜索,就像它的名字一样,它是informed,消息灵通的,它能根据最新情况而重新选择搜索。Informed Search也可以叫Heuristic Search,启发式搜索。正如上一篇提到的机器人、汽车导航、打魔兽,这些都是运用了Heuristic的搜索。何为Heuristic?Heuristic应该算一条引导你进入最佳选择的规则,它决定了状态空间中一个状态的质量,引导你每次都选择质量最好(或较好)的状态,一步步走向最佳方案。Heuristic就是一种度量,它通过一个估价函数来表示。f(n) = g(n) + h(n)其中h(n)就是heu
阅读全文
摘要:图中的算法多的要命,大多数都是搜索算法吧,因为其应用实在太广了。就比如说机器人眼中的世界其实就是一张graph,graph的大小的有限的(这跟分配给它的memory有关),机器人就根据现有的graph信息边计算边决策,然后边走边获取新graph信息,再重新计算再决策再走……这是一个迭代过程,直到到达目的地为止,汽车导航仪也是类似的。我觉得这过程有点像你用一个英雄去打敌方老窝,在地图还不是完全可见的情况下,你得亲自控制着他,看好路,根据情况选择对应的战斗策略。……哈哈扯远了,这个其实算Informed Search了,也就是带有决策的启发式搜索了(我们将在下一篇中介绍)。我们先来介绍简单的Uni
阅读全文
摘要:题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1116程序分析: 词语接龙,问能不能全部接下去,其实就是欧拉图。解决方法: 用欧拉图的知识点来判断是否存在欧拉图。欧拉图: 通过图(无向图或有向图)中所有边一次且仅一次行遍图中所有顶点的通路称为欧拉通路,通过图中所有边一次且仅一次行遍所有顶点的回路称为欧拉回路。具有欧拉回路的图称为欧拉图(Euler Graph),具有欧拉通路而无欧拉回路的图称为半欧拉图。 1.无向连通图G是欧拉图,当且仅当G不含奇数度结点(G的所有结点度数为偶数); 2.无向连通图G含有欧拉通路,当且仅当G有零个或两个...
阅读全文
摘要:题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1325程序分析: 这道题跟小希的迷宫有很大的相似吧,只是一个是无向图一个是有向图。也是给你那些结点之间的信息,然后让你判断是不是一颗树罢了,用树的定义来判断吧,无环,n个结点最多有n-1条边,不然就会有环。只有一个入度为0的结点,不存在入度大于1的结点。这些也足以判断是否为一棵树了吧。不过要注意一些特殊数据的情况,空树也是树。比如输入0 0。解决方法: 其实也可以不用并查集,这样就可以直接按照上面的条件来统计,就可以判断是不是一颗树了。方法有多种,都知道最好,但是得精通,这些天都是在练并查集,..
阅读全文
摘要:题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1856程序分析: 一个老板要完成一个项目,需要一些人来帮忙,越多越好,但是有个条件,这些人都应该彼此认识(直接跟间接),有个隐含的是如果没人可以帮忙,只好自己上阵,干活的就只有自己一个了。输入的是一对一对的朋友,他们都彼此认识。人数可以达到一千万(10000000)。解决方法: 并查集可以解决,都是把认识的挂同一棵树上,最后统计那棵树最多人,结果就是这棵树的人数了。由于n巨大,所以需要对输入的人编号进行标记(0/-1),还有统计输入的人里面编号最大的那个。只有在下面循环统计最大树时速度才能...
阅读全文
摘要:题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1198程序分析: 题意就是说有一块大田,分为很多小块的,其中每块田都有各种各样形状的水渠,现要灌溉整块大田,问需要多少个水源可以完成。给你那些小田的水渠形状图,最多有上下左右四个方向可以把水输出去。解决方法: 并查集思想,能合并的就合并为一块田,这样总能灌溉到了吧,哪么,能合并的条件是什么?对应方向可以把水渠对上去就可以合并。 可以用矩阵来存储每一块田的位置编号和图的编号,View Code 1 #include<iostream> 2 #include<string> 3
阅读全文
摘要:题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1213/*程序分析: 题意背景:生日聚会,邀请朋友来做客,不是所有的朋友都互相认识,所以人都不愿跟陌生人一起坐,现在主人要统计聚会需要多少张桌子,认识的都坐在一张桌子上,不认识的就另起炉灶,现在输入朋友个数还有朋友之间认识的组合,让你统计需要几张桌子。用计算机思想想的话其实就是让你统计有棵树,一棵树代表一张桌子。解决方法: 用并查集就可以,把认识的都合并在一棵树上,最后统计有几颗树就可以。结果集是树的数量。*/View Code 1 #include<iostream> 2 using
阅读全文
摘要:题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1232/*程序分析: 给你一些城市、城市之间的某些路,让你求最少还要再建多少条路才能实现城市与城市之间两两相通。需要注意的是,两个城市之间可以有多条路,多条也当它一条处理。如果城市之间都没有路,需要建的路就是城市的个数减一。解决方法: 利用并查集的特性,把城市之间有路的合并为一个城市,最后判定有几个城市或者有几棵树就可以了。结果也就是城市(树)数目减一,比如有三个城市就要有2条路来让他们互通! 具体看代码吧*/View Code 1 #include<iostream> 2 using
阅读全文
摘要:题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1272/*程序分析: 题目意思其实就是让你判断一个图是不是一棵树,条件就是无环、连通图,即连通分支为一解决方法: 利用并查集,把输入的房间视为一个点,有路径的就连成一起,只要找到了环,就可以判定为NO了,如果到输入最后都还没找到环就只剩两种可能了,一种就是只有一棵书,一种就是有一个以上的树,这样也可以判定是否符合问题要求了。*/View Code 1 #include<iostream> 2 using namespace std; 3 4 const int Max = 100000
阅读全文