题目简述:扫雷,点击一个格子,返回整个地图的下一个状态。
对于边界元素,可以设置两个数组,index_row,index_col,遍历到一个格子需要搜索其周围格子时,使当前格子的值一次加上数组的值,如果发现加上之后的值越界了则跳过此格子。
这样写很清晰,节省了很多代码量。
class Solution {
public:
vector<vector<int>>hasboom;
int index_row[8]={0,0,1,1,1,-1,-1,-1},index_col[8]={-1,1,-1,1,0,-1,1,0};
void count(int row,int col)
{
for(int i=0;i<8;i++)
{
int temprow=row+index_row[i],tempcol=col+index_col[i];
if(temprow>=0&&temprow<hasboom.size()&&tempcol>=0&&tempcol<hasboom[0].size())
hasboom[temprow][tempcol]++;
}
// if(row>0)
// {
// hasboom[row-1][col]++;
// if(col>0)hasboom[row-1][col-1]++;
// if(col<hasboom[0].size()-1)hasboom[row-1][col+1]++;
// }
// if(row<hasboom.size()-1)
// {
// hasboom[row+1][col]++;
// if(col>0)hasboom[row+1][col-1]++;
// if(col<hasboom[0].size()-1)hasboom[row+1][col+1]++;
// }
// if(col>0)hasboom[row][col-1]++;
// if(col<hasboom[0].size()-1)hasboom[row][col+1]++;
}
vector<vector<char>> updateBoard(vector<vector<char>>& board, vector<int>& click) {
hasboom.resize(board.size());
for(int i=0;i<board.size();i++)
{
hasboom[i].resize(board[0].size(),0);
}
for(int i=0;i<hasboom.size();i++)
{
for(int j=0;j<hasboom[0].size();j++)
{
if(board[i][j]=='M')
{
count(i,j);
}
}
}
queue<pair<int,int>>q;
q.emplace(click[0],click[1]);
while(!q.empty())
{
auto[row,col]=q.front();
q.pop();
if(board[row][col]=='M')
{
board[row][col]='X';
}
else if(board[row][col]=='E')
{
if(hasboom[row][col]==0)
{
board[row][col]='B';
for(int index=0;index<8;index++)
{
int temprow=row+index_row[index];
int tempcol=col+index_col[index];
if(temprow<0||temprow>=board.size()||tempcol<0||tempcol>=board[0].size())
continue;
else if(board[temprow][tempcol]=='M'||board[temprow][tempcol]=='E')
q.emplace(temprow,tempcol);
}
// if(row>0)
// {
// if(board[row-1][col]=='M'||board[row-1][col]=='E')
// q.emplace(row-1,col);
// if(col>0&&(board[row-1][col-1]=='M'||board[row-1][col-1]=='E'))
// q.emplace(row-1,col-1);
// if(col<board[0].size()-1&&(board[row-1][col+1]=='M'||board[row-1][col+1]=='E'))
// q.emplace(row-1,col+1);
// }
// if(col>0&&(board[row][col-1]=='M'||board[row][col-1]=='E'))
// q.emplace(row,col-1);
// if(col<board[0].size()-1&&(board[row][col+1]=='M'||board[row][col+1]=='E'))
// q.emplace(row,col+1);
// if(row<board.size()-1)
// {
// if(board[row+1][col]=='M'||board[row+1][col]=='E')
// q.emplace(row+1,col);
// if(col>0&&(board[row+1][col-1]=='M'||board[row+1][col-1]=='E'))
// q.emplace(row+1,col-1);
// if(col<board[0].size()-1&&(board[row+1][col+1]=='M'||board[row+1][col+1]=='E'))
// q.emplace(row+1,col+1);
// }
}
else
{
board[row][col]='0'+hasboom[row][col];
}
}
}
return board;
}
};