class Solution {
public:
void bfs(vector<vector<int>>& grid){
record[0][0] = 1;
p_q.push(make_pair(0,0));
int cur_x, cur_y;
int len_x = grid.size();
int len_y = grid[0].size();
is_go[0][0] = true;
while(!p_q.empty()){
cur_x = p_q.front().first;
cur_y = p_q.front().second;
p_q.pop();
for(int i=0;i<8;++i){
int target_x = cur_x + dir[i][0];
int target_y = cur_y + dir[i][1];
if((target_x >= 0 && target_x < len_x)
&& ( target_y >= 0 && target_y < len_y)
&& grid[target_x][target_y] == 0
&& !is_go[target_x][target_y]){
if(record[target_x][target_y] == -1)
record[target_x][target_y] = record[cur_x][cur_y] + 1;
else
record[target_x][target_y] = min(record[target_x][target_y], record[cur_x][cur_y] + 1);
if(!is_go[target_x][target_y]){ // 注意不要重复入队列
p_q.push(make_pair(target_x,target_y));
is_go[target_x][target_y] = true;
}
}
}
}
}
int shortestPathBinaryMatrix(vector<vector<int>>& grid) {
if(grid[0][0] != 0)
return -1;
int len_x = grid.size();
int len_y = grid[0].size();
record = new int*[len_x];
is_go = new bool*[len_x];
for(int i=0;i<len_x;++i){
record[i] = new int[len_y];
is_go[i] = new bool[len_y];
for(int j=0;j<len_y;++j){
record[i][j] = -1;
is_go[i][j] = false;
}
}
bfs(grid);
int result = record[len_x-1][len_y-1];
for(int i=0;i<len_x;++i){
delete []is_go[i];
delete []record[i];
}
delete []is_go;
delete []record;
return result;
}
private:
int **record;
bool **is_go;
queue <pair<int, int>> p_q;
int dir[8][2] = {
{-1,0}, {-1,1},
{0,1}, {1,1},
{1,0}, {1,-1},
{0,-1}, {-1,-1}
};
};