
紫书第七章
BEconfidence
坚持才是胜利之道
展开
-
UVa1601 - The Morning after Halloween(单向+双向BFS)
给出一个最大为16×16的迷宫图和至多3个ghost的起始位置和目标位置,求最少经过几轮移动可以使三个ghost都到达目标位置。每轮移动中,每个ghost可以走一步,也可以原地不动,需要注意的是任意两个ghost不能在相同的位置,因此也不能出现任意两个ghost对穿,也就是原来是ab,移动之后是ba。每个迷宫图'#'表示墙,' '表示空地,小写字母表示ghost的起始位置,大写字母表示对应ghos原创 2015-04-29 09:27:59 · 966 阅读 · 0 评论 -
UVa1603 - Square Destroyer
题意:给定一个火柴棒拼成的方格阵,然后去掉一些火柴棒,问至少再去掉几根火柴棒能够让图中一个正方形都没有。思路:1. 由于题目中给定了 n 的范围,2 * n * (n + 1) 所以能够保证所有的火柴用 __int64 的位运算表示;2. 问题的关键在于如何生成火柴构成的方阵,以及生成方阵之后如何去搜索;3. 启发式函数 h 的计算需要考量:如果删除了某个原创 2015-04-29 21:22:49 · 1787 阅读 · 1 评论 -
UVa1602 - Lattice Animals
输入n,w,h(1回溯求解,首先确定搜索对象,格子连通,所以把连通块作为搜索对象,每次枚举一个位置,然后放一个新的块,最后重判。每个连块会被枚举很多次,有方法可以确保每个n连块恰好被枚举一次。用函数generate()把每种情况枚举出来。#include#include#include#includeusing namespace std;struct Cell{原创 2015-04-29 19:40:36 · 1407 阅读 · 1 评论 -
埃及分数问题
样例输入:495 499样例输出:495/499 = 1/2+1/5+1/6+1/8+1/3992+1/14970规则是加数少比加数多好,加数相同,小的数越大越好。分析:回溯无限,宽度优先便利一层都跑不完,所以用迭代加深搜索(iterative deeping):从小到达枚举深度上线maxd,枚举上限还可以减枝。IDA*算法:深度上线maxd,当前节点n的深度为g(n),乐观估价原创 2015-04-27 14:03:35 · 1046 阅读 · 0 评论 -
12558 - Egyptian Fractions (HARD version)
#include#include#include#includeusing namespace std;typedef long long LL;const int maxn=10010;int maxd,t,tt;set sk;LL ans[maxn],v[maxn];LL gcd(LL a,LL b){ return b?gcd(b, a%b):a;}LL ge原创 2015-04-27 23:11:27 · 1039 阅读 · 2 评论 -
UVa11212 - Editing a Book
#include#include#includeusing namespace std;class Board{public: int a[16]; int h; int n; bool readIn() { int i; scanf("%d",&n); if(n == 0) return fals原创 2015-04-27 15:57:08 · 1017 阅读 · 0 评论 -
八数码问题
八数码问题:编号为1~8的8个正方形滑块被摆成3行3列(有一个格子留空),每次可以把与空格相邻的滑块(又公共边才算相邻)移动到空格中,而他原来的位置就成了新的空格,给定初始局面和目标局面(0表示空格),你的任务时计算出最少移动的步数,无法达到输出-1.样例输入:2 6 4 1 3 7 0 5 88 1 5 7 3 6 4 0 2样例输出:31分析:把八数原创 2015-04-28 10:31:49 · 1287 阅读 · 0 评论 -
UVa10603 - Fill
分析:取出水量最少的节点进行扩展,这样的程序只需要把队列queue换成优先队列priority_queue,其他部分的代码不变,下面的代码把状态(三元组)和dist合起来定义为一个Node类型,是一种常见的写法,如果要打印路径,需要把访问过的所有节点放在一个nodes数组中,然后在Node中加一个变量fa,表示父节点在nodes数组中的下标,而在队列中只存在节点在nodes数组中的下标而非节点本身原创 2015-04-28 15:08:19 · 962 阅读 · 0 评论 -
UVa1343 - The Rotation Game
因为8个转轮对应的位置比较没有规律,需要提前将这些位置存在数组中,方便旋转操作和回溯法的归位操作。利用数组来人为储存没有规律的数字。IDA*合了bfs步数最少和dfs字典序最小的优点。#include#include#define maxn 500using namespace std;int block[24];int roller[8][7]={{0,2,6,1原创 2015-04-28 13:38:54 · 1103 阅读 · 0 评论