题目
529. 扫雷游戏
我的思路
深搜:
如果点击的方块是‘M’,那么直接修改为X,并返回;
如果点击的方块是‘E’,先判断周围有多少个M,如果有n个,那么把字符修改为‘n’;如果n是0,那么对周围的个方块依次重复“深搜”,并修改为‘B’。
返回
时间复杂度和空间复杂度都是Omn也就是矩阵大小
我的实现
class Solution { public: void count(vector<vector<char>>& board, vector<int>& click){ vector<int> x = {0,0,1,1,1,-1,-1,-1}; vector<int> y = {1,-1,0,1,-1,0,1,-1}; int result= 0; for(int i=0;i<8;i++){ if((x[i]+click[0])>=0&&(x[i]+click[0])<board.size()&&(click[1]+y[i])>=0&&(click[1]+y[i])<board[0].size()){ if(board[(x[i]+click[0])][(y[i]+click[1])]=='M'){ result++; } } } if (result==0){ for(int i=0;i<8;i++){ if((x[i]+click[0])>=0&&(x[i]+click[0])<board.size()&&(click[1]+y[i])>=0&&(click[1]+y[i])<board[0].size()){ if(board[(x[i]+click[0])][(y[i]+click[1])]=='E'){ vector<int> temp = {(x[i]+click[0]),(y[i]+click[1])}; dpSearch(board,temp); } } } board[click[0]][click[1]]='B'; }else{ board[click[0]][click[1]]=result+'0'; } } void dpSearch(vector<vector<char>>& board, vector<int>& click){ if(click[0]<board.size()&&click[0]>=0&&click[1]>=0&&click[1]<board[0].size()){ if(board[click[0]][click[1]]=='M'){ board[click[0]][click[1]] = 'X'; return; }else{ if(board[click[0]][click[1]]=='E'){ board[click[0]][click[1]]='T'; count(board,click); } } } } vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) { dpSearch(board,click); return board; } };
拓展学习
借助队列使用广搜也可以,当四周不存在地雷时,把四周的节点加入到队列中。