搜索
煦--晨
菜鸟起飞
展开
-
hdu 2181 哈密顿绕行世界问题 (深搜)
回朔搜索;#include"stdio.h"#include"string.h"int map[1000][10];int mark[1000],sum[1000],m,t;void bfs(int x,int s){int i;if(s==20&&(map[x][1]==m||map[x][2]==m||map[x][3]==m)){printf("%d:原创 2013-11-15 13:30:30 · 495 阅读 · 0 评论 -
hdu(2717)Catch That Cow
运用优先队列把所有情况都入队,然后取出步数最少的。。#include"stdio.h"#include"string.h"int visit[110000];#include"queue"using namespace std;int n,m;struct point { int x,step; friend bool operator { ret原创 2013-08-15 14:49:58 · 556 阅读 · 0 评论 -
hdu(2266)深搜
本题要求在原字符串中添加一些+、-号,使所得的值所给定值相同。这提示到很明显的搜索题。注意搜索的方法。 #include"stdio.h"#include"string.h"__int64 count,m;char a[100];int b[100],k;void dfs(int x,__int64 y){ int i; if(x==k&&y原创 2013-08-14 20:34:22 · 816 阅读 · 0 评论 -
hdu(1045)Fire Net(深搜+回朔)
#include"stdio.h"#include"string.h"char map[20][20];int n,cnt;int judge(int x,int y)//判段此位置是否可以放。。{ int i; if(map[x][y]=='X') return 0; for(i=x-1;i>=0;i--) { if(map[i][y]=='@')原创 2013-08-14 18:54:25 · 602 阅读 · 0 评论 -
回溯法
与穷举的“笨拙”搜索相比,回溯法则是一种“聪明”的求解效益更高的搜索法。下面介绍回溯设计及其应用,体会回溯法相对于穷举的特点与优势。5.1.1 回溯的概念有许多问题,当需要找出它的解集或者要求回答什么解是满足某些约束条件的最佳解时,往往使用回溯法。回溯法是一种试探求解的方法:通过对问题的归纳分析,找出求解问题的一个线索,沿着这一线索往前试探,若试探成功,即得到解;若试探失败,就逐步原创 2013-08-14 13:09:23 · 1051 阅读 · 0 评论 -
hdu(1426) Sudoku Killer 数独
/*早就见过这个数独了,自己也很喜欢数独游戏;花费了一下午,才弄出来;这个题就是靠搜索和数学的知识;还是说说思路吧;首先;对于这个9*9的方格,我们要先把那些需要填数的位置存起来; 保存在结构题中,同时把这个位置赋予值为零;然后,我们要对,这些需要填数的位置我们依次在1-9之间一个一个地查找, 当然要向填上这个数要满足以下条件: 一;要填数的这原创 2013-08-26 15:49:43 · 666 阅读 · 0 评论 -
hdu(2614) Beat
简单深搜;题意;解决问题的难度是递增的,并且每次都是先从解决第一个问题开始的;所以用回朔搜索取最大值,注意开始的时候就先把第一个问题给标记了; #include"stdio.h"#include"string.h"int map[100][100];int visit[100];int n,max;void bfs(int k,int h,int t)原创 2013-08-26 11:13:56 · 598 阅读 · 0 评论 -
hdu (1072) Nightmare
很简单的一道题;对于这道题一出错的地方在于,如何让标记;因为由于要延长炸弹的时间而使得一些地方重复走;不标记的话无法结束,但要想步数最少,那么4位置一定只能走一次;所以对值是4位置进行标记就可以了;#include"stdio.h"#include"string.h"#include"queue"using namespace std;int map[100原创 2013-08-25 17:01:24 · 535 阅读 · 0 评论 -
hdu(2514) Another Eight Puzzle
/*先把题意给搞懂了就好办了;题意;给出把个各位的点,并给出了所有有关联位置的点, 这些有关连的的位置上的数都不能是连续的; 已经给出八个点以及各点的连接情况,要求两个相连的点 的值不能连续,输入部分点的值,让你填其他点的值, 检查能否填出已经是否有唯一解。只有八个点,把要填的数值排序填入点中,然后检查一下就可以了。*///思路;//首先把原创 2013-08-25 15:28:46 · 632 阅读 · 0 评论 -
hdu(1429) 胜利大逃亡(续) 队列+bfs+状态压缩
/*本题用到状态压缩,这个还真没想到,想到了也不会。。得好好学学状态压缩了;本题要采用|运算来模拟拾取钥匙点;(用用&来判断是否能打开该门; (>>右移&1来判断);100表示有第3把,111表示有第3,2,1把钥匙,如果该点为钥匙点,则可采用|运算来模拟拾取,显然0001|1000 = 1001,同理,当为相应的门时采用&运算来模拟开启,例如1101 & 0原创 2013-08-26 19:00:08 · 576 阅读 · 0 评论 -
hdu(1728)逃离迷宫
本题求的是拐弯最少的,可以用最有队列来求。。只要到达目的地,并且转的弯数小于所要求的即可。。#include"stdio.h"#include"string.h"#include"queue"char map[110][110];int visit[110][110];using namespace std;int dir[4][2]={1,0, -1,0,原创 2013-08-15 13:07:30 · 526 阅读 · 0 评论 -
hdu(1253)胜利大逃亡(队列+搜索)
本来用优先队列,没想到超时厉害。。最后改成队列,立刻过了,竟然比优先队列快乐进千毫秒。。#include"stdio.h"#include"string.h"#include"queue"using namespace std;int a,b,c,T;struct point { int x,y,z; int step;};int dir[6][3]原创 2013-08-15 16:15:08 · 525 阅读 · 0 评论 -
hdu(4597)记忆话搜索
#include"stdio.h"#include"string.h"int dp[30][30][30][30];int aa[30],bb[30],sum;int max(int a,int b){ return a>b?a:b;}int bfs(int a,int b,int c,int d,int sum){ int mx=0; if(a>b&&原创 2013-08-27 16:58:50 · 652 阅读 · 0 评论 -
hdu(2416) Treasure of the Chimp Island
/*用了一下午终于出来了;题意:要得到宝藏‘$‘,所经过的最小步数;所有入口都在边界上;可以从’#‘’A--Z,进入迷宫,从不同的入口进入是会携带不同的炸弹;0,1,。。26;;遇到‘。’直接过去,当遇到1,9时有两种选择,一是用炸弹,耗时为零,二是同过去耗时为权值;在这里选择了一个状态量,来取得最优值;*/ 题意: 给出一个图,门都在边界上。只能从一个门进去。选择耗费的原创 2013-08-29 17:04:45 · 575 阅读 · 0 评论 -
hdu(1044) Collect More Jewels
#include"stdio.h"#include"string.h"#include"queue"using namespace std;char map[100][100];int visit[100][100],a[100];int step[100][100],mark[100];int dp[100][100];int w,h,l,m,maxx,sum;原创 2013-08-28 18:01:38 · 544 阅读 · 0 评论 -
hdu(1501) Zipper
这个搜索很好想,主要是标记问题,不标记会超时;用map标记找过的字符; #include"stdio.h"#include"string.h"char a[606],b[606],c[606];int len3,flag,map[606][606];void bfs(int x,int y,int z){ if(z==len3) { flag=1;原创 2013-08-27 18:27:25 · 499 阅读 · 0 评论 -
hdu(1175)连连看
险过。。和胜利大逃亡差不多。。一样的道理。。注意进行剪枝,不满足条件的直接NO,不进入dfs之中。。 #include"stdio.h"#include"string.h"#include"queue"int map[1001][1001];using namespace std;int n,m,visit[1001][1001];int sx,sy,ex,原创 2013-08-15 17:51:59 · 515 阅读 · 0 评论 -
hdu(1548)A strange lif
还是队列用着不错,一下AC了。。。挺简单的,把所有可能全部遍历一遍,最后取最优解。。和hdu(2717)Catch That Cow一样的方法。。 #include"stdio.h"#include"string.h"#include"queue"using namespace std;int visit[210];int p[210];int n,a,原创 2013-08-15 20:08:36 · 452 阅读 · 0 评论 -
poj(1321)回朔搜索
这个题目把棋子的坐标依次存进数组里,然后再分别用两个数组记录行和列有哪些已经被占用了,之后便从第一个棋子开始深搜即可,深搜函数带两个参数p,count,p表示从当前第p个棋子开始往下搜,count表示已经放了count个棋子。把满足条件的位置一次存储起来。再利用回朔搜索,很好;;#include"stdio.h"#include"string.h"char map[100];原创 2013-08-14 16:31:15 · 522 阅读 · 0 评论 -
hdu(2553)(回朔搜索)
//此题是经典的N皇后问题,描述:在一个N*N的棋盘上要摆放N个皇后,要求任意两个//皇后不能在同一行,同一列或者同一条与棋盘的边成45度角的斜线上,即与对角线//平行的斜线上,求对于不同的N,各有多少种摆法使任意两个皇后不能相互攻击。//用回溯法就可以解决,设皇后的编号依次为1,2,……,n,则可以认为第i个皇后//必须摆放在第i行,然后枚举第一个皇后的位置进行回溯,若某原创 2013-08-14 11:30:28 · 486 阅读 · 0 评论 -
hdu(1195) Open the Lock
唉,花费了一上午才给搞出来;代码有点长,但很好理解;出错的原因;一;每次操作之前都要更新:cur=next;(重要)二;标记visit用四维,用两维吼不住;三;输入格式是用字符输入,在转化为数字,直接输入数字会把它当做一个数。 #include"stdio.h"#include"string.h"#include"queue"using namespa原创 2013-08-25 11:28:54 · 660 阅读 · 0 评论 -
hdu(1372) Knight Moves
当年的难题,现在用队列是如此的容易;不多说;#include"stdio.h"#include"string.h"int visit[10][10];int dir[8][2]={-2,1, -1,2, 2,1, 1,2, 2,-1, 1,-2, -2,-1, -1,-2};int sx,sy,ex,ey;#include"queue"using nam原创 2013-08-24 18:48:29 · 474 阅读 · 0 评论 -
poj 3411 Paid Roads
这题很特别,因为标记不能简单的为一次,他有可能为多次。。但又不能不标记,不然无法结束。。 大致题意:有n座城市和m(1注意:路径是有向的。这题难点在于“城市与城市之间可能存在多条路径”:1、 输入数据时可能会出现多条 从城市a到城市b的路径信息,但是费用有所差别;2、 对于 从城市a到城市b 的同一条路径,允许重复走。 先来看一组数据:6 5原创 2013-08-20 20:20:50 · 518 阅读 · 0 评论 -
(hdu) 1258 Sum It Up
此题重点在于要防止重复计算,引入temp,记录上一个,只要下一个数与他不相等即可。。这里也是用回朔搜索,来找完所有可能。。#include"stdio.h"#include"string.h"int visit[100];int a[100],b[100];int n,m,flag;void bfs(int x,int sum,int k){ int i原创 2013-08-20 16:25:20 · 631 阅读 · 0 评论 -
(hdu2612)
郁闷死:很容易理解的题,第一次果断超时;借第一次的经验;在搜索到两个人的过程也把到他们之间的距离存了起来;结果错误,和学哥找了一晚上,嚓,原来错着了,乖乖,字符串还没输出完我就开始查找了。。不过经过这次找错,错一点,什么不可思议的结果都会出来。。#include"stdio.h"#include"string.h"#include"queue"#define inf原创 2013-08-19 19:56:48 · 628 阅读 · 0 评论 -
hdu(2616)Kill the monster
/*对于这种情况很多,很难分析的题;一般用搜索,用回朔搜索,搜尽所有可能,然后取出最优解;*/#include"stdio.h"#define inf 9999999int a[20],b[20];int n,m,min,visit[20];void bfs(int v,int w){ int i; if(v { if(min>w) min原创 2013-08-20 11:02:24 · 516 阅读 · 0 评论 -
hdu1241
广搜题:先找到一个@点,以此为中心,向八个方向搜索,,并标记;; #include#includechar map[200][200];int dir[8][2]={-1,0, -1,1, 0,1, 1,1, 1,0, 1,-1, 0,-1, -1,-1};int sum;void bfs(int x,int y){ int i,x1,y1;原创 2013-07-30 13:31:58 · 491 阅读 · 0 评论 -
hdu 2952
体会到了搜索的魅力。。广搜题,以一个点#为中心向四周搜索,把相邻的#全找出来并标记为".";; #include#includeint dir[4][2]={0,1, 0,-1, -1,0, 1,0};char map[200][200];int sum;void bfs(int x,int y){ int i,x1,y1; for(i=0;i原创 2013-07-30 13:10:41 · 617 阅读 · 0 评论 -
hdu(hdu1016)Prime Ring Problem
#include"stdio.h"#include"string.h"#include"math.h"int a[21],b[21],n,m;int prime(int k)//判断素数。。{ int i,h; h=int(sqrt(1.0*k)); for(i=2;i { if(k%i==0) return 0; } return 1;原创 2013-07-30 20:42:23 · 537 阅读 · 0 评论 -
Red and Black(hdu1312)
//解题思路:记录好访问过点的状态,再去访问其他的点。//广搜题: //要理解搜索的过程。。#include#includeint dir[4][2]={1,0, -1,0, 0,1, 0,-1};char map[26][26];int n,m,sum;void dfs(int x,int y){ int x1,y1,i; map[x原创 2013-07-30 19:36:19 · 626 阅读 · 0 评论 -
(hdu)1027 全排序
调用STL库函数next_permutation(startAddress,endAddress) #include"stdio.h"#include"algorithm"using namespace std;int main(){ int n,m,i; int a[20000]; while(scanf("%d%d",&n,&m)!=原创 2013-08-20 18:38:53 · 469 阅读 · 0 评论 -
(hdu)1035 Robot Motion
/*为了计算循环时的步数,用visit来及所走每一个点的步数;同时,他也其标记的作用。。*/#include"stdio.h"#include"string.h"char map[100][100];int visit[100][100];int n,m,step;int judge(int x,int y){ if(x>=0&&x=0&&y retu原创 2013-08-20 12:40:56 · 506 阅读 · 0 评论 -
记忆化搜索
算法上依然是搜索的流程,但是搜索到的一些解用动态规划的那种思想和模式作一些保存。一般说来,动态规划总要遍历所有的状态,而搜索可以排除一些无效状态。 更重要的是搜索还可以剪枝,可能剪去大量不必要的状态,因此在空间开销上往往比动态规划要低很多。 记忆化算法在求解的时候还是按着自顶向下的顺序,但是每求解一个状态,就将它的解保存下来,以后再次遇到这个状态的时候,就不必重新求解了。这种方原创 2013-08-22 19:52:16 · 790 阅读 · 0 评论 -
hdu(1518) Square
这个题很好,要剪枝;题意;用这n个木棒是否可以摆成一个正方形;用搜索做的思路;利用回朔法来找 使一个或几个棒的长度之和等于正方形的边长;当满足时s+1,s代表找到满足边长的个数,只要s==4,即已经找到完,可以结束了;同时都清零,s+1;否则的话,s不变,len+map,i+1,继续搜索;另外注意优化,只要flag=1;便可以结束了;#include"st原创 2013-08-24 18:04:27 · 519 阅读 · 0 评论 -
hdu(2260) Accepted Necklace
//这个做着很顺,一下就对了,难道找到感觉了;//用回朔法,把所有值遍历一遍,取其中最大值即可; #include"stdio.h"#include"string.h"int k,h,a[30],b[30];int visit[30],max,m;void bfs(int n,int v,int w,int l){ int i; if(n==k&&v {原创 2013-08-24 19:36:53 · 635 阅读 · 0 评论 -
hdu(1254)推箱子
//题目意思很简单,但要拿下这道题必须明白以下几点;//一;一个木块要想推动它,必须要保证他的前后都必须是道路;//二;用一个dfs来搜索,是否能从人的位置,到达人将要推木块的位置,也就是木块的后方;其中人不能从此时木块的位置经过;//三;用bfs神搜的过程中,为了防止超时,要将小的入队,这也是引入dp的原因;dp【I】【j】【k】表示从k方向推到(i,j)的最小格数;//四,在b原创 2013-08-24 12:22:14 · 617 阅读 · 0 评论 -
hdu(1997) 汉诺塔VII
若把n个盘子从柱子a通过柱子b移到柱子c,则先把n-1个盘子从柱子a移动柱子b,再把第n个盘子从a移道c,再把n-1个盘子从b移到a。所以当判断序列是否符合把n个盘子从a移到c时,第n个只能出现在柱子a的最底部,或柱子c的最底部,否则这个序列错的。当第n个盘子在a的最底部时,则继续判断剩下的序列是否把n-1个盘子从a移到b。当第n个盘子在c的最底部时,则继续判断剩下的序列是否把n-1个原创 2013-08-23 18:53:51 · 617 阅读 · 0 评论 -
hdu(2425) Hiking Trip
题意;给出一个地图,地图有四种路面,经过每种路面花费的时间不同,问从起点到终点所花费的最少时间是多少这个题很好;独自完成了;所要注意的是;一;用队列这样写不对,要控制入队的量;二;不要把值直接赋在map上,只要在map标记下即可, 然后再bfs中加上对应的时间值; #include"stdio.h"#include"string.h"#inclu原创 2013-08-23 15:02:29 · 620 阅读 · 0 评论 -
hdu(2102) A计划
/*题意很容易理解;值得注意的是:把那些不能走的转化为墙;一;如果#的对面是“*”,则将#变为’*‘;二;两层对应的都是’#‘则把他们都转化为’*‘;错几次的原因;一;bfs中不满足是输出负一,不能是零,找了好久才找到这个错误;二;用了三维坐标,不好控制;三;上面的转化没转化完;四,visit放在外边超时了;*/ #include"stdio.h"#原创 2013-08-23 12:55:54 · 543 阅读 · 0 评论 -
hdu(1078) FatMouse and Cheese (记忆化搜索+dp)
/*第一次用记忆化搜索,其实并不难,只不过在搜索的同时记住了在各个坐标的权值。在这里题意是;在一个n*n的矩阵里,值是权值,在竖直或水平方向上行走1--k步,全只要递增,不能重复走,到最后使其总权值和最大。说白了就是找一个递增序列,使其总和值最大。。*/这一题综合了DFS和DP,很好的一道题。dp[i][j]表示以第i行第j列个网格为起点所能得到的最大值,需要注意的是一原创 2013-08-22 19:53:23 · 614 阅读 · 0 评论