随笔分类 -  搜索

Pushing Boxes(推箱子)
摘要:poj 1475题目大意:给出一个地形图,S表示人的起始位置,B表示箱子的位置,T表示要把箱子推倒的位置,刚开始的时候没看到要的是推箱子步数最少,其次是人的步子数最小。解决:两个bfs,第一个bfs以箱子的位置为状态,箱子扩展到下一个状态扩展人的位置,最终的目的是箱子到达目标位置。刚开始的时候是定义了一个vis[25][25][25][25] 的四维数组来标记状态是否已经存在,但是wa,后来仔细想了一下,这样会把正确的枝剪掉,四维数组在两个bfs中用不行,若只有一个bfs还可以。最终还是选择了两个标记数组,但是别忘了在每一个bfs之前要清除标记#include <iostream> 阅读全文
posted @ 2011-09-23 10:11 猿类的进化史 阅读(405) 评论(0) 推荐(0) 编辑
Addition Chains(加法链)
摘要:poj 2248题目大意:给出一系列数的最后一个数,默认第一个数是1,求一系列数字,要求除第一个数外,其它的每个数都是前边两个数的和(可以是同一个数加上本身),求最少需要多少个数就能加到给定的数 ,输出,过程解决:bfs+路径记录,记录路径可以在结构体中加入当前地址,值,和从哪个扩展来的,三个数就够了。本题,最开始思考的时候,想着bfs一般都是要用到vis数组记录是否走过,以避免重复而导致陷入死循环, 但是,当用了vis数组后,新的问题来了,比如数n,有好多条路劲到达数n的,但是,如果第一个进队列下次遇到n不进队列了,会导致若最终求的是m,不一定第一个进队列的刚好是到m最短的,后来仔细想了下, 阅读全文
posted @ 2011-09-18 23:50 猿类的进化史 阅读(1905) 评论(1) 推荐(0) 编辑
square(正方形)
摘要:poj 2362题目大意:给出一些数,问你能不能把这些数,分成4堆,没堆的和相等解决:dfs+回溯,此题用的剪枝稍微少一些就不行#include <iostream> #include <cstring>#include <algorithm>#include <cstdio>#include <functional>using namespace std;int num[30],ave,n;bool found;bool vis[30];bool check(){ for(int i=0;i<n;i++)if(!vis[i]) 阅读全文
posted @ 2011-09-17 23:56 猿类的进化史 阅读(384) 评论(0) 推荐(0) 编辑
8数码问题解决方案(转)
摘要:8数码问题 问题简介: 所谓八数码问题是指这样一种游戏:将分别标有数字1,2,3,…,8的八块正方形数码牌任意地放在一块3×3的数码盘上。放牌时要求不能重叠。于是,在 3×3的数码盘上出现了一个空格。现在要求按照每次只能将与空格相邻的数码牌与空格交换的原则,将任意摆放的数码盘逐步摆成某种特殊的排列。如下图表示了 一个具体的八数码问题求解。问题分析: 首先,八数码问题包括一个初始状态(START) 和 目标状态(END),所谓解八数码问题就是在两个状态间寻找一系列可过渡状态 (START->STATE1->STATE2->...->END)。这个状态是 阅读全文
posted @ 2011-09-14 19:16 猿类的进化史 阅读(2775) 评论(0) 推荐(0) 编辑
Knight Moves(骑士旅行2)
摘要:poj 2243题目大意:给出骑士的起始和终止位置,求出最少需要多少步子到达终点解决:本来上一道这样的题已经做过了,又遇见了就再复习下吧,上一道题是双向bfs,但是使用了stl中的queue,刚开始也是用的stl的queue但是157ms,想着还没有自己写过front,rear手工队列,于是改成了手工的,有想着改成循环队列吧,节省空间,又都改成了循环队列;复习下循环对列的知识:length=(rear-front+MAXSIZE)%MAXSIZE;入队:q[rear]=new node; rear=(rear+1) %MAXSIZE;出对:curnode=q[front]; front=(fr 阅读全文
posted @ 2011-09-14 18:55 猿类的进化史 阅读(221) 评论(0) 推荐(0) 编辑
Jugs(罐子)
摘要:题目大意:给出两个空杯子,已知这两个空杯子的容量,有无限多的水,再给出要求得到的体积,找出一种方法,得到要求的体积解决:BFS+路径记录#include <iostream>#include <cstdio>#include <queue>using namespace std;int ca,cb,n,ex,ey;//有六种选择方案,记录的时候只需要记录下,方案的代号0-6即可char p[6][20]={"fill A","fill B","pour B A","pour A B&quo 阅读全文
posted @ 2011-09-13 18:18 猿类的进化史 阅读(323) 评论(0) 推荐(0) 编辑
Sudoku(数独)
摘要:题目描述:都玩过这个游戏,同行同列不能出现相同的数字,同一个9格子中也不能相同的出现。解决:dfs+回溯把每行每列不能用的元素检出来,在搜索的时候看每9个格子的情况,用check函数, 用两个vis数组存放行的信息和列的信息#include <iostream>#include <cstdio>using namespace std;int map[10][10];bool vis1[10][10],vis2[10][10];bool found;bool check(int x,int y,int val){//检测每9个格子中的数是否重复 for(int i=(x- 阅读全文
posted @ 2011-09-12 22:14 猿类的进化史 阅读(345) 评论(0) 推荐(0) 编辑
Eight
摘要:poj 1077/hdoj 1043题目大意:你懂得解决:A*,在poj上数据很弱,后来他们说zoj和hdoj都有这道题,就在过一下,这次数据是多组的,没想到都超时了,原因是有无解的情况,关键是如何判断无解的情况,他们说提前都能判断出来,判了两次没盘出来,后来才知道是这样整的:由于一个空格和其他的数字交换位置,若是与同一行交换,逆序数的个数不变(这可是不包含9,就把那个当成空格处理),若是与同一列交换,要么是增加2,要么是减少2,可见奇偶性不变,根据这个可以判断出是否有解,若没有解在a*,因为一定会有解顺便推荐一篇好文章http://hi.baidu.com/benbearlove/blog/ 阅读全文
posted @ 2011-09-12 21:47 猿类的进化史 阅读(304) 评论(0) 推荐(0) 编辑
Knight Moves(骑士旅行)
摘要:poj 1955题目大意:给出地图的长和宽,和骑士的起始位置和终点位置,求出最少的移动步数解决: 双广,由于地图比较大比较适合双搜#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;int n,sx,sy,ex,ey;bool vis[2][305][305];int dx[]={2,2,-2,-2,1,1,-1,-1};int dy[]={1,-1,1,-1,2,-2,2,-2};struct node { int x 阅读全文
posted @ 2011-09-09 21:46 猿类的进化史 阅读(175) 评论(0) 推荐(0) 编辑
放苹果
摘要:poj 1664题目大意:解决:dfs,整数划分问题,#include <iostream>using namespace std;int n,m,cnt;int res[15];bool check(){ for(int i=1;i<n;i++) if(res[i]<res[i-1])return false; return true;}void dfs(int deep,int cur_app,int p){ //deep>n比不可少,本来以为不要也行,但是由于下边的条件不一定总是满足, //可能导致死循环了,所以很有必要独立写出一行 if(deep>n 阅读全文
posted @ 2011-09-09 12:21 猿类的进化史 阅读(155) 评论(0) 推荐(0) 编辑
Dungeon Master(地下城主)
摘要:poj 2251题目大意:给你一张三维地图 ,给出起点S和中点E,让你找出经过多少步子会到达中点解决:简单bfs,代码就不贴了,只需有个x,y,z三维个增量不要写错了,就行了,其余和二维一样 阅读全文
posted @ 2011-09-07 23:44 猿类的进化史 阅读(245) 评论(0) 推荐(0) 编辑
棋盘问题
摘要:poj 1321题目大意:解决:dfs+回溯,类似于八皇后问题,分两种情况,第n行放或者不放,放的话回溯,不放的话直接进入下一行#include <iostream>#include <cstdio>using namespace std;int cnt,n,k;char map[10][10];int r[10],c[10];void dfs(int cur_step,int cur_cnt){ if(cur_cnt == k){cnt++;return;} if(cur_step == n)return; for(int i=0;i<n;i++) { if.. 阅读全文
posted @ 2011-09-07 21:23 猿类的进化史 阅读(212) 评论(0) 推荐(0) 编辑
LETTERS(字母)
摘要:poj 1154题目描述:给出一些字母组成一个地图,要求若下一步能行得通,必须是没有走过的字母,即路径中不能出现相同的字母解决:DFS+回溯/*本来是加了个vis数组,想着将走过的每一步进行标记,其实不需要vis,因为有26个字母的b数组控制着呢,若走过了肯定不会再走重复了,但是最多也相当于用了vis和没用一样啊,为什么用了vis反而wa了呢*/#include <iostream>#include <bitset>using namespace std;int m,n,maximal=0;char map[25][25];bitset<26> b;int 阅读全文
posted @ 2011-09-07 16:41 猿类的进化史 阅读(223) 评论(0) 推荐(0) 编辑
A Knight's Journey(骑士周游)
摘要:poj 2488题目大意:给出一张地图从任意位置出发,找到一条路径,能够周游所有的地方。解决:dfs+回溯,这道题更深刻理解了一下回溯,但是仍然不知道,遍历的顺序为何是这样,如果谁知道,请指教也提供了一种记录路径的方法,进入递归函数立刻记录,因为这个x,y是有效的,只有进入递归的x,y才是有效的路径#include <iostream>#include <bitset>using namespace std;int m,n;int dx[]={-1,1,-2,2,-2,2,-1,1,};int dy[]={-2,-2,-1,-1,1,1,2,2};char res[90 阅读全文
posted @ 2011-09-06 21:44 猿类的进化史 阅读(455) 评论(0) 推荐(0) 编辑
Oil Deposits(石油存储)
摘要:poj 1562题目大意:给出一个地图,‘@’表示存在石油,‘*’表示空白,求出共有多少个油田,相邻的或者是对角线相邻算同一个油田解决:bfs或者是dfs,本题采用dfs#include <iostream>using namespace std;int m,n;const int N=105;char map[N][N];int dx[]={1,-1,0,0,1,1,-1,-1};int dy[]={0,0,1,-1,1,-1,1,-1};void dfs(int x,int y){ map[x][y]='*'; for(int i=0;i<8;i++) { 阅读全文
posted @ 2011-09-05 20:32 猿类的进化史 阅读(199) 评论(0) 推荐(0) 编辑
Image Perimeters(图像周长)
摘要:poj 1111题目大意:给出一个地图,‘x’代表有效区域,‘.’代表空白区域,在给出鼠标点击的位置,求鼠标点击位置的有效区域的周长是多大解决:BFS,关键是如何求周长的问题,由于一个‘x’,有四个面,如果该格子四周周围有n个面(只需统计四周,而不是八个方向都需要统计),则这个‘x’的有效周长是4-n,如何知道周围有多少个面,只需要在四个面遍历的时候记录下就行了,用了一个vis数组表示i,j这个地方有没有‘x’存在,vis数组是一直不变的而BFS中访问过的用‘.’,以免重复访问。#include <iostream>#include <cstring>#include 阅读全文
posted @ 2011-09-05 19:57 猿类的进化史 阅读(501) 评论(0) 推荐(0) 编辑
滑雪
摘要:poj 1088题目大意:解决:记忆化搜索 dfs#include <iostream>using namespace std;#define D "%d" #define _S scanf const int N=105;int map[105][105];int dp[105][105];bool vis[105][105];int m,n;int dx[]={1,-1,0,0};int dy[]={0,0,-1,1};int dfs(int x,int y){ if(dp[x][y] > 0)return dp[x][y]; for(int i=0; 阅读全文
posted @ 2011-09-04 22:24 猿类的进化史 阅读(174) 评论(0) 推荐(0) 编辑
Avoid The Lakes(躲开湖水区)
摘要:题目大意:给出一个地图,地图中有湖水区和干燥区,求出湖水区的最大面积解决:纯BFS,不用剪枝#include <iostream> #include <queue>using namespace std;int map[105][105];int n,m,k;int dx[]={1,-1,0,0};int dy[]={0,0,1,-1};struct node { int x,y; node(){} node(int xx,int yy):x(xx),y(yy){}};int bfs(int x,int y){ queue<node> q; node t,t 阅读全文
posted @ 2011-09-04 18:00 猿类的进化史 阅读(267) 评论(0) 推荐(0) 编辑
Catch That Cow(捉住那头牛)
摘要:poj 3278题目大意:给出坐标中人的位置和牛的位置,然后牛不动,让你按照给定的策略(走一秒,退一退,走二倍当前的时间)去到牛的身边,求最小步子数解决:DFS,分析若一开始牛在人的身后,只有往后退的份了,所以加一个判断条件最好#include <iostream>#include <queue>using namespace std;int n,k;struct node{ int pos,step; node(int p,int s){pos=p;step=s;} node(){}};bool inq[200005];int bfs(){ node t; queue 阅读全文
posted @ 2011-09-04 10:31 猿类的进化史 阅读(306) 评论(0) 推荐(0) 编辑
Maze(迷宫)
摘要:poj 2157题目大意:S是起点,G是 终点,"."是可走的路,“X”是不可走的路解决:BFS 本题有些难度,因为若为钥匙,将钥匙吃了之后,将这个点变为“.”,若为门,判断是否对应该门的钥匙都拿到手了,若都拿到手了,可以将这个门打开,即变为“.”,否则,等这个点周围的所有点都进队列后,若队列为空说明路都走过了,一定无法通过,若队列非空,说明还有其他的路可以走,将这个点入队列,一会等着把钥匙都得到了,在出队列判断。#include <iostream>#include <cstdio>#include <queue>using names 阅读全文
posted @ 2011-08-27 11:38 猿类的进化史 阅读(356) 评论(0) 推荐(0) 编辑