但是做法上有些出入。 HDU 时间限制比较长,而且是多组输入,所以要逆向bfs 进行打表处理。 而POJ 1077 这个题目,时间是1S ,单组输入。 因此输入一组 搜索一组即可。 9个数的排列 判重用康托展开来做。 但是这个队列要自己写,STL的queue 会超时。 自己写的队列,在输出时 能很方便的用la[]数组来记录上一个 ...
【POJ1077】Eight-A*+康托展开 测试地址:Eight 题目大意:一个3*3的棋盘上有8个格子写着1~8的数字,还有一个空格,给定局面,要求给出一个空格的移动序列,使得达到目标状态: 1 2 3 4 5 6 7 8 x(空格) 做法:大名鼎鼎的八数码问题...学习了A*算法后,今天特意去试做了了下,居然过了,数据好水啊... 题...
POJ 1077 八数码难题 终于自己AC了这道八数码难题,用的方法是最最普通的单项BFS+Hash,这里主要的难点在于如何保存状态,其实,在八数码里所有的状态共有9!种=362880种,所以在每个转台节点,我需要一个char state[3][3]来记录当前棋盘的状态,用一个int x,y来记录当前x的位置,用char operation来记录从父状态到这...
7 5 8 7 5 8 7 X 8 7 8 X 把“X”与上下左右方向数字交换的行动记录为“u”、“d”、“l”、“r”。 现在,给你一个初始网格,请你通过最少的移动次数,得到正确排列。 二、思路 不想去写康拓展开,那就只能用unordered_map,但是POJ又不支持,那就只能用速度慢点的map来映射了。 h函数估价:全部的点...
链接:https://vjudge.net/problem/POJ-1077 申明:本题没有AC,因为存在多解情况下没有明确说选择哪条路径,所以不同bfs方法出来的最优路径可能有所不同。 第一个练习的bfs问题,采取了比较简化的做法,没有优化纯粹暴力,先说下关键思路。 1、用一个九位数来表示当前33棋盘的状态 ...
用康托展开做哈希函数,直接BFS就可以了 #include<iostream> #include<cstring> using namespace std; int fac[10]={1,1,2,6,24,120,720,5040,40320,362880}; void swap(int &a, int &b) { int t=a; a=b; b=t; } int cantor(int x) ...
POJ1077Eight:八数码问题 题目链接: http://poj/problem?id=1077 题目类型:隐式图搜索 原题: The15-puzzlehasbeenaroundforover100years;evenifyoudon'tknowitbythatname,you'veseenit. Itisconstructedwith15slidingtiles,eachwithanumberfrom1to15onit,andallpackedintoa4by ...
HDU 1043 和 POJ 1077 两题类似。。。但是输入不同。 HDU 上是同时多组输入,POJ 是单组输入。 两个限时不同。 HDU 上反向搜索,把所有情况打表出来。 POJ 上正向搜索。 #include #include #include #include #include using namespace std; const int maxn=1000000; ...
https://lvxiaoxin.github.io/2018/05/19/POJ-1077/ POJ 1077 八数码 三种解法lvxiaoxin added gitalk /2018/05/19/POJ-1077/ labels Mar 3, 2019 Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment ...
本问题实为 POJ 1077 Eight,前年写的代码,今天加上注释,作为对 A* 的复习。 76 77 这里只要求找出一个解即可,不必找出最优解,且空间不大,仅 9!,因而 A* 具有优势。 78 79 简单解释几个地方,具体见代码注释。 80 81 1.排列转化为序数 82