Solution:
This question is pretty straightforward. May consider the BSF strategy. (DSF also works, but usually the code length will be a little bit longer for "diffusion" problems in a 2D matrix). Also need a visit matrix to record the visiting status: for each element, if it has been visited(or pushed into a queue), then no more is needed. Without this visit matrix, infinity loop may occur. See code below:
Code:
- class Solution {
- public:
- vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {
- if(board.empty() || board.front().empty()) return board;
- int x=click[0], y=click[1];
- if(board[x][y]=='M'){
- board[x][y]='X';
- return board;
- }
- int m = board.size(), n = board.front().size();
- queue<pair<int, int>> q;
- vector<vector<bool>> visit(m, vector<bool>(n, true));
- q.push(make_pair(x, y));
- visit[x][y]=false;
- vector<vector<int>> d={{0,1},{1,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,0},{1,-1}};
- while(q.size()){
- pair<int, int> t=q.front();
- q.pop();
- int ct=0;
- for(auto a:d){
- int tx=t.first+a[0], ty=t.second+a[1];
- if(tx>=0&&tx<m&&ty>=0&&ty<n){
- if(board[tx][ty]=='M') ++ct;
- }
- }
- if(ct==0) {
- board[t.first][t.second]='B';
- for(auto a:d){
- int tx=t.first+a[0], ty=t.second+a[1];
- if(tx>=0&&tx<m&&ty>=0&&ty<n){
- if(visit[tx][ty]&&board[tx][ty]=='E') {
- q.push(make_pair(tx, ty));
- visit[tx][ty]=false;
- }
- }
- }
- }
- else board[t.first][t.second]=ct+'0';
- }
- return board;
- }
- };