1. 基本的状态转移是很好找的.
2. 难点是判重和状态的保存.
判重我用的是visited[x][y]二维数组, A为容量x, B为容量y时标记已访问;当再次A为容量x, B为容量y时,不再重复搜索.
至于状态的保存我用的是一个结构体
struct Step
{
int cnt; //一走步数
int prex, prey; //前一步的分别容量prex, prey
int preflag; //前一步到本步骤执行的操作标志
};
后面的实现就不赘述了.
本题集BFS的最值问题和保存状态问题于一身,不失为一道好题!
另一种方法:
采用的是在队列中直接保存以前的状态, 效率没有上面的方式高, 但是对于状态的保存, 很有参考价值.
struct Pots
{
int x, y; //当前x, y量
int op; //到本步的操作
int pre; //前一状态在队列中的位置
Pots() {}
Pots(int xx, int yy, int _op, int _pre){x = xx; y = yy; op = _op; pre = _pre;}
};