题目描述
解题思路
bfs暴力查找+小剪枝
首先特判一下特殊情况,当第二个与第一个的距离差大于1的话,直接返回false
对于每个石子的下一跳都有三种情况,k-1、k、k+1。其中这个K代表当前这个石子是由多长的步数跳过来的。
假设当前位置为pos,它是由k长度跳过来的。vis[pos][k]表示这个状态是否出现过。
需要注意的是:一定要判断vis[pos][k]是否之前出现,如果 出现过则不再进行搜索。
举个栗子:pos - 1 的位置跳了k-1步到了pos则pos出现(pos,k)这种状态(三种情况中的一种);
pos - 2 的位置跳了k步到了pos,则pos也会出现(pos,k)这种状态(三种状态中的一种);
所以,如果不对重复的状态进行剪枝的话会导致多余的搜索次数,因此在这里需要一个小的剪枝。
代码实现
struct node
{
int k;
int x;
};
int dx[] = {