题意很简单,就是每一次移动的步数与前一次移动的步数的绝对值差值不能超过一。很容易能想到dfs,但是单纯的dfs会tle。
可以想一想如果已经知道可以从x到y,下一次再到达x还需要再考虑y吗?所以可以采用记忆化来进行剪枝,我这里用set pre【i】来存储i点的前置节点。考虑到0 <= stones[i] <= 231 - 1
所以需要进行离散化,我这里使用了map。
class Solution {
public:
unordered_map<int,int>mp;
set<int>pre[2100];
void dfs(int from,int to){
if(from==to || pre[mp[to]].count(mp[from]))
return ;
int mov=to-from;
if(mp[to]){
pre[mp[to]].insert(mp[from]);
dfs(to,to+mov-1);
dfs(to,to+mov);
dfs(to,to+mov+1);
}
}
bool canCross(vector<int>& stones) {
for(int i=0;i<stones.size();++i)
mp[stones[i]]=i+1;
dfs(0,1);
return pre[stones.size()].size() ?true:false;
}
};