BFS
分两种的情况:
①蛇是横着的,则有三种状态的变换:向右走,向下走,顺时针旋转
②蛇是竖着的,亦有三种状态的变换:向下走,向右走,逆时针旋转
同时用哈希表来记录蛇走过的状态来去重,细节多实现略繁琐但思路不难。
class Solution {
public:
int minimumMoves(vector<vector<int>>& grid) {
int m=grid.size();
vector<unordered_set<int>> g(m*m);
queue<pair<int,int>> q;
g[0].insert(1);
q.push({0,1});
int len=0;
while(!q.empty()){
int sz=q.size();
while(sz--){
auto [t,h]=q.front();
q.pop();
int tx=t/m,ty=t%m;
int hx=h/m,hy=h%m;
if(tx==m-1&&ty==m-2&&hx==m-1&&hy==m-1) return len;
if(tx==hx){
if(hy+1<m&&!grid[hx][hy+1]){
if(!g[hx*m+hy].count(hx*m+hy+1)){
q.push({hx*m+hy,hx*m+hy+1});
g[hx*m+hy].insert(hx*m+hy+1);
}
}
if(hx+1<m&&!grid[hx+1][hy]&&!grid[tx+1][ty]){
if(!g[(tx+1)*m+ty].count((hx+1)*m+hy)){
q.push({(tx+1)*m+ty,(hx+1)*m+hy});
g[(tx+1)*m+ty].insert((hx+1)*m+hy);
}
if(!g[tx*m+ty].count((tx+1)*m+ty)){
q.push({tx*m+ty,(tx+1)*m+ty});
g[tx*m+ty].insert({tx*m+ty,(tx+1)*m+ty});
}
}
}else if(ty==hy){
if(hx+1<m&&!grid[hx+1][hy]){
if(!g[hx*m+hy].count((hx+1)*m+hy)){
q.push({hx*m+hy,(hx+1)*m+hy});
g[hx*m+hy].insert({hx*m+hy,(hx+1)*m+hy});
}
}
if(hy+1<m&&!grid[hx][hy+1]&&!grid[tx][ty+1]){
if(!g[tx*m+ty+1].count(hx*m+hy+1)){
q.push({tx*m+ty+1,hx*m+hy+1});
g[tx*m+ty+1].insert({tx*m+ty+1,hx*m+hy+1});
}
if(!g[tx*m+ty].count(tx*m+ty+1)){
q.push({tx*m+ty,tx*m+ty+1});
g[tx*m+ty].insert({tx*m+ty,tx*m+ty+1});
}
}
}
}
len++;
}
return -1;
}
};
时间复杂度:O(n^n)。
空间复杂度:O(n^n)。