摘要:
HDU_2234 这个题目可以先从终态出发,把5步以内的所有状态预处理出来,同时为了进一步减少状态,利用最小表示法的思想,将终态看成只有两种:1111222233334444和1234123412341234,这样我的程序最终跑出来就只有157370个状态了。 在查询的时候,由于前面我们用最小表示法将状态简化了,那么现在就要将1、2、3、4全排列一下生成24种状态,每种状态都查找一下,然后取这24种状态下的最小值。#include<stdio.h>#include<string.h>#include<algorithm>#define HASH 100000 阅读全文
摘要:
HDU_1430 一开始以为只是个简单的bfs,结果发现写完超时,也就是说虽然总状态不多,但case很多,为了应对这样的情况比较好的办法就是预处理出来,然后O(1)查询并递归打印操作。 如果想预处理出来的话,那么必须要么固定起点,要么固定终点,由于这个题目要字典序最小,固定起点更方便。接着就是要将每个case转化成同一个起点就可以了。#include<stdio.h>#include<string.h>#define HASH 100007#define MAXD 100010int op[][8] = { {7, 6, 5, 4, 3, 2, 1, 0}, {3, 0 阅读全文
摘要:
HDU_3278 尽管如果考虑有三种颜色的话状态数会很多,但如果一旦确定我们要将哪个颜色移到中间,其余的两个颜色就可以视作一种颜色,因此就可以先从终态开始bfs一遍,记录下结果,每次读一个图,就枚举三种颜色当作移到中间的颜色,然后O(1)查询步数即可。#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>#define HASH 1000007#define MAXD 1000010#define INF 0x3f3f3f3fstruct Point{ int s 阅读全文
摘要:
HDU_3638 如果除去怪物的话这个题和普通的BFS走迷宫没太大区别,因此不妨将怪物看得相对分离一点,每到一秒先将怪物的视野处理出来,然后这一秒既不走到怪物的视野内又不走到*的位置即可。 在处理怪物的视野时,可以先用一个结构体存储怪物的方位,每过一秒就自动更新怪物的方位,再打一个包括4个方向且每个方向上有9个相对位置的表,这样就比较好处理出怪物的视野了。#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>#define MAXN 60int trans[] = 阅读全文