第五章 深度与广度优先搜索(下)
二、广度优先搜索
剑指 Offer 13. 机器人的运动范围
class Solution {
int **board;
int k,m,n;
queue<pair<int,int>> Q;
public:
bool isaccess(int m,int n){
if(m%10 + m/10 + n%10 + n/10 > k) return false;
else return true;
}
bool issafe(int x,int y){
if(x<0 || x>=m || y<0 || y>=n) return false;
return true;
}
void bfs(){
int x,y;
while(!Q.empty()){
pair<int,int> temp = Q.front();
Q.pop();
x = temp.first;y = temp.second;
if(board[x][y]!=0) continue;
if(isaccess(x,y)){
board[x][y]=1;
if(issafe(x-1,y)) Q.push(make_pair(x-1,y));
if(issafe(x+1,y)) Q.push(make_pair(x+1,y));
if(issafe(x,y-1)) Q.push(make_pair(x,y-1));
if(issafe(x,y+1)) Q.push(make_pair(x,y+1));
}else{
board[x][y]=-1;
}
}
}
int movingCount(int m, int n, int k) {
this->k=k; this->m=m; this->n=n;
int total = 0;
board = new int* [m];
for(int i = 0; i < m; i++){
board[i] = new int[n];
memset(board[i],0,n*sizeof(int));
}
Q.push(make_pair(0,0));
bfs();
for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
if(board[i][j]==1) total++;
}
return total;
}
};