题目大意:
就是一个3*3矩阵的游戏, 现在一共有9个格子, 然后有8个格子被8种方块填充, 另外一个是空格, 现在给出了一个表分别表示A~I位置能到达的位置和需要的代价
需要的代价只有两种
每次可以移动一个块到空位置
为从一个状态最小需要多少代价变成另外一种
大致思路:
首先对于一个当前的游戏状态,用康托展开来记录当前状态,即当前状态可以表示成a1, a2, a3, ..., a9是一个0~8的排列
那么这个状态可以映射成 a1*0! + a2*1! + .. + a9*8!
其中ai表示第i个数的前面比ai小的有几个
那么可以将所有的9!种状态映射到数字0~9! - 1
那么每个点相连的边数是4, 权值有两种
这样建好一个图之后,跑一下最短路即可
我写的spfa...貌似堆优化的dijkstra要快一点
注意建图的边要预处理, 不能每次都完全重建, 不然容易超时
代码如下:
Result : Accepted Memory : ? KB Time : 2176 ms
/*
* Author: Gatevin
* Created Time: 2015/10/31 13:46:57
* File Name: Sakura_Chiyo.cpp
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include